2014-04-02 91 views
12

Bir REST API'sı için RestSharp kullanarak sorun yaşıyorum Çalıştığım bir proje için kullanmam gerekiyor. Sormam gereken istek üç bölümden oluşuyor: Bir başlık API anahtarı, yüklenecek bir dosya ve JSON biçimindeki bir grup veri. API, veri bölümünün "veri" form alanı adı kullanılarak gönderilmesini gerektirir. Bazı nedenlerden dolayı bu, soruna neden olan "veri" alanını isimlendirdiği için sorunlara neden oluyor.HTTP POST Çoklu Gönderme/form verileri alanı RestSharp kullanarak gönderme

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); 

ben request.AddBody(doc) yöntem ve request.AddParameter(name, object, type) yöntemi hem kullanmaya teşebbüs ettik görebileceğiniz gibi şöyledir:

ben olarak sahip koddur. Her ikisi de verileri düzgün şekilde gönderiyor görünmüyor, çünkü gerekli parametrelerin eksik olduğunu söyleyen sunucudan yanıt aldım. Kemancıyı kullanarak ikili verileri görebilirim, ancak her iki yöntemle de JSON verilerini asla. RestSharp belgelerini inceledim, ancak form veri gövdesi için belirli bir "alan" adını "veri" olarak belirtmeme izin veren bir şey bulamıyorum. . Burada neyi yanlış yapıyorum?

DÜZENLEME: Fiddler ile daha fazla inceleme yapıldığında, JSON verilerimi hiç HTTP isteğinin gövdesine eklemiyor görünmektedir. Ancak, yükleme işleminden hemen önce bir kırılma noktasıyla (execute komutu), parametre listesinde (ve dosya listesinin) düzgün bir şekilde serileştirilmiş her şeyi görebiliyorum. Fiddler ile teftiş yaparken, ikili veriyi ve sonra çok parçalı/form-veri sınırı ve sonra hiçbir şey göremiyorum. Verilerimin burada olması gerektiği varsayılır ...

+0

Başlığınızı düzenledim. Lütfen, "[Sorular soruların başlığında" etiketler içeriyor mu? "(Http://meta.stackexchange.com/questions/19190/)" bölümüne bakacak olursak, fikir birliği "hayır, yapmamalı" dır. –

+0

Üzgünüm, bunu yap! Sadece bu makaleyi okuyun, düzenleme için teşekkürler. – JNYRanger

+0

Aynı zamanda cevabını araştırıyorum. @JNYRanger cevabı henüz buldunuz mu ..? Çözümünüz varsa lütfen bana bildirin. Şimdiden teşekkürler. –

cevap

7

Bunu, çok parçalı form görüntülerini otomatik olarak öldüren ve onları göndermeyecek olan AddBody yöntemini kullanarak bir sorun etrafında çalışarak yapıyorum. Bunun yerine add parametresini kullanmalısınız.

Bu sorunu çözmek için, iletişimin her iki tarafında da biraz çalışma yapmanız gerekebilir.

benim web hizmeti tarafında
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"); 

, ben yönteme argüman olarak json kabul edip elle dosya akışları başvurusu elde:

aşağıdaki do istemciden mesaj göndermek için
public JsonResult MyService(StoreImageRequest request) 
{ 
    var frontImage = HttpContext.Request.Files["front"].InputStream; 
    var backImage = HttpContext.Request.Files["front"].InputStream; 
} 
+0

bu kod sizin için çalışıyor @C Tierney. Bazı parametrelerle birlikte bir dosya yüklemek istiyorum ancak çalışamıyorum. Her zaman durum kodu 0 ile yanıt alıyorum. {"Temel bağlantı kapatıldı: Gönderme sırasında beklenmedik bir hata oluştu."} – Adam

-1

sunucu daha sonra JSON beden ve Dosyalar parça, bir çok parçalı işleyebilir ise:

 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); 

Sunucu tarafında bu tür çok bölümlü istek şu şekilde işlenmelidir:

[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

Bu soruyu (3 yıldan daha önce) RestSharp kitaplığındaki bir hatanın neden olduğu davranış nedeniyle açtım. yıl: https://github.com/restsharp/RestSharp/issues/524 Bu cevap, orijinal sorunun neden var olduğunu ve nasıl düzeltileceğini yanıtlamıyor. – JNYRanger