Publicación de parámetros de RestSharp JSON


141

Estoy tratando de hacer una llamada REST muy básica a mi MVC 3 API y los parámetros que paso no son vinculantes para el método de acción.

Cliente

var request = new RestRequest(Method.POST);

request.Resource = "Api/Score";
request.RequestFormat = DataFormat.Json;

request.AddBody(request.JsonSerializer.Serialize(new { A = "foo", B = "bar" }));

RestResponse response = client.Execute(request);
Console.WriteLine(response.Content);

Servidor

public class ScoreInputModel
{
   public string A { get; set; }
   public string B { get; set; }
}

// Api/Score
public JsonResult Score(ScoreInputModel input)
{
   // input.A and input.B are empty when called with RestSharp
}

¿Me estoy perdiendo de algo?

Respuestas:


211

No tiene que serializar el cuerpo usted mismo. Solo haz

request.RequestFormat = DataFormat.Json;
request.AddBody(new { A = "foo", B = "bar" }); // uses JsonSerializer

Si solo desea los parámetros POST (que aún se asignarían a su modelo y es mucho más eficiente ya que no hay serialización a JSON), haga esto:

request.AddParameter("A", "foo");
request.AddParameter("B", "bar");

44
Ambos. Sin embargo, el segundo enfoque es mucho más rápido.
Wesley Tansey

44
También puede hacer AddObject(new { A = "foo", B = "bar" })lo que toma las propiedades del objeto y las convierte en parámetros
John Sheehan

62
Para aquellos que quieran jsonizarse:request.AddParameter("text/json", body, ParameterType.RequestBody);
Kyle Patterson el

1
@KylePatterson también puede implementar su propio ISerializer y configurar RestClient.JsonSerializer para usarlo.
John Sheehan

2
Hay una parántesis obsoleta después de la request.AddBody(new ...en su primer ejemplo.
Benjamin

54

En la versión actual de RestSharp (105.2.3.0) puede agregar un objeto JSON al cuerpo de la solicitud con:

request.AddJsonBody(new { A = "foo", B = "bar" });

Este método establece el tipo de contenido en application / json y serializa el objeto en una cadena JSON.


1
¿Cómo adjuntar un archivo a esta solicitud?
OPV

1
¿Cómo nombras el objeto? p.ej. si necesita enviar "detalles": {"extra": "cosas"}?
mdegges

@OPV Puede agregar un archivo a la solicitud de esta manera: request.AddFile (pathToTheFile);
Chris Morgan

1
@mdegges Si está utilizando una clase anónima como el cuerpo para que el JSON se vea como su ejemplo, configure la solicitud RestSharp de esta manera: var client = new RestSharp.RestClient("http://your.api.com"); var request = new RestSharp.RestRequest("do-something", Method.POST); var body = new {details = new {extras = "stuff"}}; request.AddJsonBody(body); var response = client.Execute(request);
Chris Morgan

43

Esto es lo que funcionó para mí, para mi caso fue una publicación para solicitud de inicio de sesión:

var client = new RestClient("http://www.example.com/1/2");
var request = new RestRequest();

request.Method = Method.POST;
request.AddHeader("Accept", "application/json");
request.Parameters.Clear();
request.AddParameter("application/json", body , ParameterType.RequestBody);

var response = client.Execute(request);
var content = response.Content; // raw content as string  

cuerpo :

{
  "userId":"sam@company.com" ,
  "password":"welcome" 
}

2
¿Cómo inserta el cuerpo en su código C #? como string body = "{" userId ":" sam@company.com "," password ":" welcome "}"; No funciona.
Kynao

1
Debería usar "" en lugar de "string body = @" {"" userid "", ... "
Vitaly Ascheulov

7

Espero que esto ayude a alguien. Funcionó para mí

RestClient client = new RestClient("http://www.example.com/");
RestRequest request = new RestRequest("login", Method.POST);
request.AddHeader("Accept", "application/json");
var body = new
{
    Host = "host_environment",
    Username = "UserID",
    Password = "Password"
};
request.AddJsonBody(body);

var response = client.Execute(request).Content;

Parece que request.AddHeader("Accept", "application/json");es la respuesta correcta.
Bimal Poudel

0

Si tiene varios Listobjetos, puede serializarlos a JSON de la siguiente manera:

List<MyObjectClass> listOfObjects = new List<MyObjectClass>();

Y luego usa addParameter:

requestREST.AddParameter("myAssocKey", JsonConvert.SerializeObject(listOfObjects));

Y deberá configurar el formato de solicitud para JSON:

requestREST.RequestFormat = DataFormat.Json;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.