2014-04-02 176 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

相關問題