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?

Wesley Tansey
fuente

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");
John Sheehan
fuente
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.

Chris Morgan
fuente
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":"[email protected]" ,
  "password":"welcome" 
}
Coral
fuente
2
¿Cómo inserta el cuerpo en su código C #? como string body = "{" userId ":" [email protected] "," 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;
Arenoso
fuente
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;
tomloprod
fuente