c# - 使用 RestSharp 发送 HTTP POST 多部分/表单数据字段

标签 c# json rest multipartform-data restsharp

我在将 RestSharp 用于 REST API 时遇到问题,我需要将其用于我正在处理的项目。我需要发出的请求分为三个部分: header API key 、要上传的文件和一堆 JSON 格式的数据。 API 要求使用表单字段名称“data”发送数据部分。出于某种原因,这会导致问题,因为它在请求正文中将字段命名为“数据”。

我的代码如下:

var request = new RestRequest(UPLOAD_DOC_URLSEGMENT, Method.POST)
{
    RequestFormat = DataFormat.Json,
    AlwaysMultipartFormData = true,
    JsonSerializer = new RestSharpJsonDotNetSerializer(customSerializer)
};

if (doc is DocA)
    request.AddParameter("data",doc as DocA,ParameterType.RequestBody);
    //request.AddBody(doc as DocA);
else
    request.AddParameter("data", doc as DocB,ParameterType.RequestBody);
    //request.AddBody(doc as DocB);

request.AddFile("file", doc.File.FullName);

如您所见,我尝试同时使用 request.AddBody(doc) 方法和 request.AddParameter(name, object, type) 方法。他们似乎都没有正确发送数据,因为我收到服务器的响应,说缺少必需的参数。使用 fiddler 我可以看到二进制数据,但看不到这两种方法的 JSON 数据。我已经浏览了 RestSharp 文档,但我找不到任何允许我将特定“字段”名称指定为表单数据主体的“数据”的内容,我认为这是导致我遇到的问题的原因.我在这里做错了什么?

编辑:在进一步检查 fiddler 后,它似乎根本没有将我的 JSON 数据添加到 HTTP 请求的主体中。但是,在上传之前有一个断点(执行命令),我可以看到参数列表(和文件列表)中正确序列化的所有内容。使用 Fiddler 检查时,我看到文件二进制数据,然后是多部分/表单数据边界,然后什么也没有。我会假设这是我的数据应该在的地方......

最佳答案

所以我通过使用 AddBody 方法来解决一个问题,该方法会自动杀死多部分表单图像并且不会发送它们。 您必须改用添加参数。

要解决这个问题,您可能需要在通信双方做一些工作。

要从客户端发送消息,您需要执行以下操作:

new RestRequest("<Your URI>");
request.AddParameter("request", tokenRequest.ToJson());
request.AddFile("front", frontImage.CopyTo, "front");
request.AddFile("back", backImage.CopyTo, "back");
request.AddHeader("Content-Type", "multipart/form-data");

在我的网络服务端,我接受 json 作为方法的参数并手动获取对文件流的引用:

public JsonResult MyService(StoreImageRequest request)
{
    var frontImage = HttpContext.Request.Files["front"].InputStream;
    var backImage = HttpContext.Request.Files["front"].InputStream;
}

关于c# - 使用 RestSharp 发送 HTTP POST 多部分/表单数据字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22799392/

相关文章:

python - 将带有json列的数据从mysql导入到elasticsearch

rest - grpc 和 websocket 有什么区别?哪一种更适合双向流连接?

rest - 在 Acumatica 中使用 REST API 将数据提供程序和场景替换为代码

c# - 使用 LINQ 过滤列表

c# - 在不使用 Interop-DLL 的情况下在 Visual Studio C# 中使用 COM+ 对象

javascript - jQuery toggleClass() 方法不适用于 JSON 生成的内容

rest - Powershell 3.0 Invoke-WebRequest HTTPS 在所有请求上都失败

c# - 当 .Net Thread 没有名称时,如何使用 NLog 打印 threadid 而不是 threadname?

java - 重定向和平衡 Java 输出流量

json - 无法从 String 反序列化 java.time.LocalDate 类型的值