Publication de paramètres RestSharp JSON


141

J'essaie de faire un appel REST très basique à mon API MVC 3 et les paramètres que je transmets ne sont pas liés à la méthode d'action.

Client

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

Serveur

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
}

Est-ce que j'ai râté quelque chose?

Réponses:


211

Vous n'avez pas à sérialiser le corps vous-même. Fais juste

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

Si vous voulez juste des paramètres POST à ​​la place (qui mapperaient toujours à votre modèle et sont beaucoup plus efficaces car il n'y a pas de sérialisation vers JSON), procédez comme suit:

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

4
Tous les deux. La deuxième approche est cependant beaucoup plus rapide.
Wesley Tansey du

4
Vous pouvez faire AddObject(new { A = "foo", B = "bar" })aussi ce qui prend les propriétés de l'objet et les convertit en paramètres
John Sheehan

62
Pour ceux qui veulent se faire plaisir:request.AddParameter("text/json", body, ParameterType.RequestBody);
Kyle Patterson

1
@KylePatterson, vous pouvez également implémenter votre propre ISerializer et configurer RestClient.JsonSerializer pour l'utiliser.
John Sheehan

2
Il y a une paranthèse obsolète après le request.AddBody(new ...dans votre premier exemple.
Benjamin

54

Dans la version actuelle de RestSharp (105.2.3.0), vous pouvez ajouter un objet JSON au corps de la requête avec:

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

Cette méthode définit le type de contenu sur application / json et sérialise l'objet en une chaîne JSON.


1
Comment joindre un fichier à cette demande?
OPV

1
comment nommez-vous l'objet? par exemple. si vous avez besoin d'envoyer des "détails": {"extra": "stuff"}?
mdegges

@OPV Vous pouvez ajouter un fichier à la requête comme ceci: request.AddFile (pathToTheFile);
Chris Morgan

1
@mdegges Si vous utilisez une classe anonyme comme corps pour que le JSON ressemble à votre exemple, configurez la requête RestSharp comme ceci: 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

C'est ce qui a fonctionné pour moi, pour mon cas c'était un post pour la demande de connexion:

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  

corps:

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

2
Comment insérez-vous le corps dans votre code c #? comme string body = "{" userId ":" sam@company.com "," password ":" welcome "}"; ne marche pas.
Kynao

1
Vous devriez utiliser "" au lieu de "string body = @" {"" userid "", ... "
Vitaly Ascheulov

7

J'espère que cela aidera quelqu'un. Cela a fonctionné pour moi -

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;

On dirait que request.AddHeader("Accept", "application/json");c'est la bonne réponse.
Bimal Poudel

0

Si vous avez un Listobjet, vous pouvez les sérialiser en JSON comme suit:

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

Et puis utilisez addParameter:

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

Et vous devrez définir le format de la requête sur JSON:

requestREST.RequestFormat = DataFormat.Json;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.