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?

Wesley Tansey
la source

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

Chris Morgan
la source
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":"[email protected]" ,
  "password":"welcome" 
}
corail
la source
2
Comment insérez-vous le corps dans votre code c #? comme string body = "{" userId ":" [email protected] "," 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;
Sablonneux
la source
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;
tomloprod
la source