restclient form example deserialize data addfile c# json rest multipartform-data restsharp

c# - example - restsharp post form data



Enviando el campo HTTP POST Multipart/form-data usando RestSharp (2)

Así que estoy haciendo esto resolviendo un problema con el uso del método AddBody que mata automáticamente las imágenes de los formularios de varias partes y no las envía. Debe utilizar agregar parámetro en su lugar.

Para resolver este problema, es posible que tenga que hacer un poco de trabajo en ambos lados de la comunicación.

Para enviar el mensaje desde el cliente, haga lo siguiente:

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

En mi lado del servicio web, acepto el json como el argumento del método y obtengo manualmente una referencia a las secuencias de archivos:

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

Tengo problemas al utilizar RestSharp para una API REST que debo usar para un proyecto en el que estoy trabajando. La solicitud que debo emitir consta de tres partes: una clave API de encabezado, un archivo para cargar y un montón de datos en formato JSON. La API requiere que la parte de datos se envíe utilizando un nombre de campo de formulario de "datos". Por alguna razón, esto está causando problemas ya que está nombrando el campo "datos" dentro del cuerpo de la solicitud.

El código que tengo es el siguiente:

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

Como puede ver, he intentado usar tanto el método request.AddBody(doc) método request.AddParameter(name, object, type) . Ninguno de ellos parece estar enviando los datos correctamente porque recibí una respuesta del servidor que dice que faltan los parámetros necesarios. Usando fiddler puedo ver los datos binarios, pero nunca los datos JSON con ambos métodos. He revisado la documentación de RestSharp, pero no puedo encontrar nada que me permita especificar un nombre de "campo" en particular como "datos" para el cuerpo de datos del formulario, que es lo que creo que está causando el problema que tengo. . ¿Qué estoy haciendo mal aquí?

EDITAR: Tras una inspección adicional con el violinista, parece que no está agregando mis datos JSON en absoluto al cuerpo de la solicitud HTTP. Sin embargo, con un punto de interrupción justo antes de la carga (comando de ejecución) puedo ver todo serializado correctamente dentro de la lista de parámetros (y la lista de archivos). Al inspeccionar con Fiddler, veo el archivo de datos binarios, y luego un límite de datos de múltiples partes / formulario, y luego nada. Supongo que aquí es donde se supone que mis datos están ...


Si su servidor puede procesar varias partes con cuerpo JSON y partes de Archivos, entonces:

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

En el lado del servidor, dicha solicitud de varias partes debe procesarse como:

[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]; }