2014-04-02 236 views
12

我遇到了使用RestSharp进行REST API的问题,我需要为我正在处理的项目使用Rest API。我需要发出的请求分为三部分:头部API密钥,要上传的文件以及一堆JSON格式的数据。 API要求使用“数据”的表单字段名称发送数据部分。出于某种原因,这是由于它在请求正文中命名字段“数据”而引起的问题。使用RestSharp发送HTTP POST多部分/表单数据字段

我的代码如下:

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文档,但我找不到任何允许为表单数据主体指定特定“字段”名称作为“数据”的任何内容,这是我认为会导致我遇到的问题。我在这里做错了什么?

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

+0

我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –

+0

对不起,回合!请阅读该文章,感谢编辑。 – JNYRanger

+0

我也在寻找它的答案。 @JNYRanger你找到了答案吗?请让我知道你是否有解决方案。提前致谢。 –

回答

7

所以我这样做是通过解决使用AddBody方法自动杀死多部分表单图像并不会发送它们的问题。 您必须改用add参数。

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

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

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; 
} 
+0

这个代码是否适合你@C Tierney。我想上传一个文件以及一些参数,但我无法得到它的工作。我总是得到状态码0的回应。 {“底层连接已关闭:发送时发生意外错误。”} – Adam

-1

如果您的服务器可以处理多部分使用JSON的身体和文件的部分,则:

 var req = new RestRequest(UPLOAD_DOC_URLSEGMENT, Method.POST); 

     req.RequestFormat = DataFormat.Json; 
     req.AddBody(doc); 

     req.AddFileBytes("TestImage", Properties.Resources.TestImage, "TestImage.jpg"); 

     req.AddHeader("apikey", "MY-API-KEY"); 
     var resp = restClient.Execute<ApiResult>(req); 

在服务器端这样的多部分请求应该被处理为:

[HttpPost] 
    public JsonResult UploadDoc() 
    { 
     // This is multipart request. So we should get JSON from http form part: 
     MyDocModel doc = JsonConvert.DeserializeObject<MyDocModel>(Request.Form[0]); 

     foreach (string fileName in request.Files) 
     { 
      HttpPostedFileBase file = request.Files[fileName]; 
     } 
+0

由于RestSharp库中的错误导致的行为(最初3年前)年份: https://github.com/restsharp/RestSharp/issues/524此答案不回答为什么存在原始问题以及如何更正它。 – JNYRanger

相关问题