2014-04-02 10 views
12

Ho problemi con RestSharp per un'API REST che devo utilizzare per un progetto su cui sto lavorando. La richiesta che devo emettere è suddivisa in tre parti: una chiave API di intestazione, un file da caricare e una serie di dati in formato JSON. L'API richiede che la parte dati venga inviata utilizzando un nome campo modulo di "dati". Per qualche motivo questo sta causando problemi poiché sta denominando il campo "dati" all'interno del corpo della richiesta.Invio di POST HTTP Campo multipart/form-data utilizzando RestSharp

Il codice ho come è il seguente:

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

Come potete vedere ho tentato di utilizzare sia il metodo e il metodo request.AddBody(doc)request.AddParameter(name, object, type). Nessuno dei due sembra inviare i dati correttamente perché ricevo una risposta dal server che dice che mancano i parametri richiesti. Usando il fiddler posso vedere i dati binari, ma mai i dati JSON con entrambi questi metodi. Ho consultato la documentazione di RestSharp, ma non riesco a trovare nulla che mi permetta di specificare un nome "campo" come "dati" per il corpo dei dati del modulo, che è ciò che credo stia causando il problema che sto avendo . Cosa sto facendo di sbagliato qui?

MODIFICA: dopo un'ulteriore ispezione con il violinista, sembra che non aggiunga i miei dati JSON al corpo della richiesta HTTP. Tuttavia, con un punto di interruzione subito prima del caricamento (comando di esecuzione) posso vedere tutto serializzato correttamente all'interno dell'elenco dei parametri (e dell'elenco dei file). Durante l'ispezione di Fiddler, vedo i dati binari del file e quindi un limite multipart/form-data, quindi nulla. Immagino che questo sia il posto in cui dovrebbero essere i miei dati ...

+0

Ho modificato il titolo. Per favore vedi, "[Le domande dovrebbero includere" tag "nei loro titoli?] (Http://meta.stackexchange.com/questions/19190/)", dove il consenso è "no, non dovrebbero". –

+0

Scusa, per quello! Basta leggere quell'articolo, grazie per la modifica. – JNYRanger

+0

Sono anche alla ricerca della sua risposta. @JNYRanger hai trovato la risposta ancora ..? per favore fatemi sapere se avete una soluzione. Grazie in anticipo. –

risposta

7

Così sto facendo questo aggirando un problema con l'utilizzo del metodo AddBody che uccide automaticamente le immagini del modulo multiparte e non le invierà. È necessario utilizzare invece il parametro add.

Per risolvere questo problema potrebbe essere necessario eseguire un piccolo lavoro su entrambi i lati della comunicazione.

Per inviare il messaggio dal client di effettuare le seguenti:

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

Da parte mia servizio web, accetto il JSON come argomento per il metodo e ottenere manualmente un riferimento ai flussi di file:

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

fa funzionare questo codice per te @C Tierney. Voglio caricare un file insieme ad alcuni parametri, ma non riesco a farlo funzionare. Ricevo sempre una risposta con il codice di stato 0. {"La connessione sottostante è stata chiusa: si è verificato un errore imprevisto su un invio."} – Adam

-1

Se il server in grado di elaborare un multi-parte con il corpo JSON e parti file, quindi:

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

Al lato server tale richiesta in più parti devono essere trattati come:

[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

Inizialmente avevo aperto questa domanda (più di 3 anni fa) a causa di un errore nella libreria RestSharp, che è stato corretto fino all'ultimo anno: https://github.com/restsharp/RestSharp/issues/524 Questa risposta non risponde perché il problema originale esisteva e come correggerlo. – JNYRanger