2014-04-02 11 views
12

Ich habe Probleme mit RestSharp für eine REST-API, die ich für ein Projekt, an dem ich arbeite, verwenden muss. Die Anforderung, die ich ausgeben muss, besteht aus drei Teilen: Einem Header-API-Schlüssel, einer Datei zum Hochladen und einer Reihe von Daten im JSON-Format. Die API erfordert, dass der Datenteil unter Verwendung eines Formularfeldnamens "Daten" gesendet wird. Aus irgendeinem Grund verursacht dies Probleme, da es das Feld "Daten" innerhalb des Körpers der Anfrage nennt.Senden von HTTP POST Multipart/Formulardatenfeld mit RestSharp

Der Code, den ich als habe sich wie folgt:

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

Wie man sehen kann ich versucht habe sowohl die request.AddBody(doc)-Methode und die request.AddParameter(name, object, type) Methode zu verwenden. Keiner von ihnen scheint die Daten korrekt zu senden, da ich eine Antwort vom Server erhalte, die besagt, dass die erforderlichen Parameter fehlen. Mit Fiddler kann ich die Binärdaten sehen, aber nie die JSON-Daten mit diesen beiden Methoden. Ich habe die RestSharp-Dokumentation durchgesehen, aber ich kann nichts finden, was es mir erlaubt, einen bestimmten "Feldnamen" als "Daten" für den Formulardatenkörper anzugeben, was meiner Meinung nach das Problem verursacht, das ich habe . Was mache ich hier falsch?

BEARBEITEN: Bei weiterer Überprüfung mit Fiddler scheint es, dass es meine JSON-Daten überhaupt nicht zum Hauptteil der HTTP-Anfrage hinzufügt. Mit einem Breakpoint direkt vor dem Upload (Befehl execute) kann ich jedoch alles in der Parameterliste (und Dateiliste) richtig serialisiert sehen. Bei der Überprüfung der mit Fiddler sehe ich die Datei binäre Daten, und dann eine Multipart/Form-Daten-Grenze, und dann nichts. Ich würde annehmen, das ist, wo meine Daten sein sollen ...

+0

Ich habe Ihren Titel bearbeitet. Bitte lesen Sie "[Sollten die Fragen" Tags "in ihren Titeln enthalten?] (Http://meta.stackexchange.com/questions/19190/)", wobei der Konsens "nein, sie sollten nicht" lautet. –

+0

Entschuldigung, das ist es! Lies einfach diesen Artikel, danke für die Bearbeitung. – JNYRanger

+0

Ich bin auch auf der Suche nach seiner Antwort. @JNYRanger hast du die Antwort schon gefunden ..? Bitte lassen Sie mich wissen, wenn Sie eine Lösung haben. Danke im Voraus. –

Antwort

7

Also mache ich dies, indem ich ein Problem mit der AddBody-Methode umgehen, die automatisch die mehrteiligen Formbilder abtötet und sie nicht sendet. Sie müssen stattdessen den Parameter add verwenden.

Um dieses Problem zu lösen, müssen Sie auf beiden Seiten der Kommunikation etwas arbeiten.

Um die Nachricht vom Client senden Sie Folgendes tun:

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

auf meiner Web-Service-Seite, ich akzeptiere die json als Argument für das Verfahren und manuell einen Verweis auf den Datei-Streams erhalten:

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

funktioniert dieser Code für Sie @C Tierney. Ich möchte eine Datei mit einigen Parametern hochladen, aber ich kann es nicht funktionieren. Ich bekomme immer eine Antwort mit dem Statuscode 0. {"Die zugrunde liegende Verbindung wurde geschlossen: Beim Senden ist ein unerwarteter Fehler aufgetreten."} – Adam

-1

Wenn Ihr Server kann ein mehrteiliges mit JSON Körper und Dateien Teile verarbeiten, dann:

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

Auf der Serverseite sollte eine solche mehrteilige Anfrage wie folgt verarbeitet werden:

[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

Ich habe diese Frage ursprünglich (vor 3+ Jahren) aufgrund eines Verhaltens in der RestSharp-Bibliothek, das zuletzt korrigiert wurde, verursacht Jahr: https://github.com/restharp/RestSharp/issues/524 Diese Antwort beantwortet nicht, warum das ursprüngliche Problem existierte und wie man es korrigiert. – JNYRanger