Публикация параметров RestSharp JSON

Я пытаюсь сделать очень простой вызов REST для моего API MVC 3, и параметры, которые я передаю, не привязаны к методу действия.

Клиент

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

Сервер

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
}

Я что-то упустил?


person Wesley Tansey    schedule 10.06.2011    source источник


Ответы (7)


Вам не нужно самостоятельно сериализовать тело. Просто делать

request.RequestFormat = DataFormat.Json;
request.AddJsonBody(new { A = "foo", B = "bar" }); // Anonymous type object is converted to Json body

Если вместо этого вам просто нужны параметры POST (которые по-прежнему будут отображаться в вашей модели и намного эффективнее, поскольку нет сериализации в JSON), сделайте следующее:

request.AddParameter("A", "foo");
request.AddParameter("B", "bar");
person John Sheehan    schedule 10.06.2011
comment
Оба. Однако второй подход намного быстрее. - person Wesley Tansey; 11.06.2011
comment
Вы также можете сделать AddObject(new { A = "foo", B = "bar" }), который принимает свойства объекта и преобразует их в параметры. - person John Sheehan; 11.06.2011
comment
что, если имя элемента содержит тире (-)? - person Ivan G.; 28.03.2012
comment
Используйте [SerializeAs] для XML или то, что JSON.NET использует для достижения того же результата. - person John Sheehan; 30.03.2012
comment
Для тех, кто хочет jsonize себя: request.AddParameter("text/json", body, ParameterType.RequestBody); - person Kyle Patterson; 02.03.2013
comment
@KylePatterson, вы также можете реализовать свой собственный ISerializer и настроить RestClient.JsonSerializer для его использования. - person John Sheehan; 21.03.2013
comment
@JohnSheehan, возможно, это недавнее изменение, но JsonSerializer установлен в RestRequest, а не в RestClient. В RestClient есть десериализатор, но он устанавливается с помощью AddHandler. - person Scott; 09.07.2013
comment
После request.AddBody(new ... в вашем первом примере есть одна устаревшая скобка. - person Benjamin; 15.07.2014
comment
AddHeader и AddBody не работали, но метод AddParameter, предложенный @KylePatterson, работает. Странный! - person Gaui; 27.10.2015
comment
Для меня использование AddParameters вызвало внутреннюю ошибку сервера. Пришлось воспользоваться первым способом. - person mac10688; 03.11.2015
comment
Как прикрепить файл к этому запросу? - person OPV; 23.07.2017
comment
устарело / не работает для json (по умолчанию используется xml ??), используйте AddJsonBody () - person Andrew; 13.12.2019

В текущей версии RestSharp (105.2.3.0) вы можете добавить объект JSON в тело запроса с помощью:

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

Этот метод устанавливает тип содержимого как application / json и сериализует объект в строку JSON.

person Chris Morgan    schedule 31.01.2017
comment
Как прикрепить файл к этому запросу? - person OPV; 23.07.2017
comment
как назвать объект? например. если вам нужно отправить детали: {extra: stuff}? - person mdegges; 08.02.2018
comment
@OPV Вы можете добавить файл к запросу следующим образом: request.AddFile (pathToTheFile); - person Chris Morgan; 09.02.2018
comment
@mdegges Если вы используете анонимный класс в качестве тела, чтобы JSON выглядел как ваш пример, настройте запрос RestSharp следующим образом: 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); - person Chris Morgan; 09.02.2018

Это то, что сработало для меня, в моем случае это была запись с запросом на вход:

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  

тело :

{
  "userId":"[email protected]" ,
  "password":"welcome" 
}
person Soumyaansh    schedule 21.01.2016
comment
Как вставить тело в код на C #? в виде строки body = {userId: [email protected], пароль: welcome}; не работает. - person Kynao; 19.07.2018
comment
Вместо строки следует использовать body = @ {userid, ... - person Vitaly Ascheulov; 05.08.2019

Надеюсь, это кому-то поможет. Это сработало для меня -

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;
person Sandy    schedule 21.05.2019
comment
Похоже, request.AddHeader("Accept", "application/json"); - правильный ответ. - person Bimal Poudel; 03.10.2019

Если у вас есть List объектов, вы можете сериализовать их в JSON следующим образом:

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

А затем используйте addParameter:

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

И вам нужно будет установить формат запроса на JSON:

requestREST.RequestFormat = DataFormat.Json;
person tomloprod    schedule 17.09.2018

Возможно, вам потребуется десериализовать анонимный тип JSON из тела запроса.

var jsonBody = HttpContext.Request.Content.ReadAsStringAsync().Result;
ScoreInputModel myDeserializedClass = JsonConvert.DeserializeObject<ScoreInputModel>(jsonBody);
person Varun Nair    schedule 15.01.2021

Вот полный код рабочего приложения консоли. Пожалуйста, установите пакет RestSharp.

using RestSharp;
using System;

namespace RESTSharpClient
{
    class Program
    {
        static void Main(string[] args)
        {
        string url = "https://abc.example.com/";
        string jsonString = "{" +
                "\"auth\": {" +
                    "\"type\" : \"basic\"," +
                    "\"password\": \"@P&p@y_10364\"," +
                    "\"username\": \"prop_apiuser\"" +
                "}," +
                "\"requestId\" : 15," +
                "\"method\": {" +
                    "\"name\": \"getProperties\"," +
                    "\"params\": {" +
                        "\"showAllStatus\" : \"0\"" +
                    "}" +
                "}" +
            "}";

        IRestClient client = new RestClient(url);
        IRestRequest request = new RestRequest("api/properties", Method.POST, DataFormat.Json);
        request.AddHeader("Content-Type", "application/json; CHARSET=UTF-8");
        request.AddJsonBody(jsonString);

        var response = client.Execute(request);
        Console.WriteLine(response.Content);
        //TODO: do what you want to do with response.
    }
  }
}
person Syed Nasir Abbas    schedule 03.08.2020