restresponse restrequest resource how example deserializer c# restsharp

c# - restrequest - restsharp request resource



¿RestSharp sobrescribe manualmente el tipo de contenido? (2)

Estoy creando un RestSharp.RestRequest a través de:

RestRequest request = new RestRequest(); request.Method = Method.POST; request.Resource = "/rest-uri"; request.AddHeader("Content-Type", "application/someContentType"); string xml = "<?xml version=/"1.0/" encoding=/"UTF-8/" standalone=/"yes/"?>" + Environment.NewLine + "<register-request">" + Environment.NewLine + " <name=/"someName/"/>" + Environment.NewLine + "</register-request>"); request.AddParameter("text/xml", registerSinkRequest, ParameterType.RequestBody);

(El tipo de contenido se establece manualmente en application/someContentType )

En modo de depuración también muestra Content-Type=application/someContentType

Pero la ejecución de RestRequest devuelve un 415 Media Not Supported -Error y WireShark muestra que Media-Type está establecido en text/xml (como el conjunto en el método AddParameter).

¿Por qué RestSharp muestra un tipo de contenido diferente al de WireShark? ¿Y cómo puedo evitar que se modifique el Content-Type (si lo está)?


El comentario de svick es correcto. Establezca el tipo de contenido en el primer parámetro de AddParameter() y puede omitir la llamada AddHeader() .

Si bien esa es la respuesta "correcta", explicaré por qué tiene un método confuso para hacer esto que no es exactamente obvio.

La forma prevista de lograr esto es usar AddBody() junto con RestRequest.RequestFormat . Un ejemplo:

var client = new RestClient(); // client.XmlSerializer = new XmlSerializer(); // default // client.XmlSerializer = new SuperXmlSerializer(); // can override with any implementaiton of ISerializer var request = new RestRequest(); request.RequestFormat = DataFormat.Xml; request.AddBody(objectToSerialize);

La serialización de objectToSerialize se basa en el XmlSerializer registrado. Si usa RequestFormat = DataFormat.Json , entonces se usa RestClient.JsonSerializer . Las implementaciones de ISerializer (que puede utilizar para anular la serialización predeterminada) declaran sus propios tipos de contenido, que es lo que se pasa a través de la sobrecarga de AddParameter() que está usando.

AddParameter(contentType, content, ParameterType.RequestBody) nunca debió llamarse directamente. Se agregó como una solución para pasar datos de AddBody() pero luego otras cosas se volvieron dependientes de ella, por lo que se mantuvo. En retrospectiva, fue una decisión terrible, pero es demasiado tarde para cambiarla en la línea de la versión 1xx. Si alguna vez construyo otra versión, haré esto más obvio.


Es posible cambiar el tipo de contenido cuando configura el contenido del cuerpo. El parámetro NAME para Body establece el tipo de contenido.

oRequest.Parameters.Add(new Parameter() { Name = "application/json;charset=UTF-8", Type = ParameterType.RequestBody, Value = sBody });