#c# #json #asp.net-mvc-3 #rest #restsharp
#c# #json #asp.net-mvc-3 #rest #restsharp
Вопрос:
Я пытаюсь выполнить очень простой вызов REST для моего MVC 3 API, и параметры, которые я передаю, не привязаны к методу action.
Клиент
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
}
Я что-то здесь упускаю?
Ответ №1:
Вам не нужно сериализовать тело самостоятельно. Просто сделайте
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");
Комментарии:
1. Оба. Однако второй подход намного быстрее.
2. Вы также можете сделать
AddObject(new { A = "foo", B = "bar" })
, который принимает свойства объекта и преобразует их в параметры3. Для тех, кто хочет сам jsonize:
request.AddParameter("text/json", body, ParameterType.RequestBody);
4. @KylePatterson вы также можете реализовать свой собственный ISerializer и установить RestClient. JsonSerializer для его использования.
5. После
request.AddBody(new ...
в вашем первом примере есть один устаревший параграф.
Ответ №2:
В текущей версии RestSharp (105.2.3.0) вы можете добавить объект JSON в тело запроса с помощью:
request.AddJsonBody(new { A = "foo", B = "bar" });
Этот метод устанавливает тип содержимого в application / json и сериализует объект в строку JSON.
Комментарии:
1. Как прикрепить файл к этому запросу?
2. как вы называете объект? например. нужно ли отправлять «подробности»: { «extra»: «stuff»}?
3. @OPV Вы можете добавить файл к запросу следующим образом: request. Добавить файл (pathToTheFile);
4. @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);
Ответ №3:
Это то, что сработало для меня, в моем случае это был post для запроса входа в систему :
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":"sam@company.com" ,
"password":"welcome"
}
Комментарии:
1. Как вы вставляете тело в свой код c #? в виде тела строки = «{ «Идентификатор пользователя»:»sam@company.com «, «пароль»: «добро пожаловать» }»; не работает.
2. Вы должны использовать «» вместо » строковое тело = @» { «»идентификатор пользователя»», … »
3. Если у меня есть «var myJSON = «{ JSON Content }», то какие изменения я должен внести в AddParameters?
Ответ №4:
Надеюсь, это кому-нибудь поможет. У меня это сработало —
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;
Комментарии:
1. Похоже,
request.AddHeader("Accept", "application/json");
это правильный ответ.
Ответ №5:
Если у вас есть List
объектов, вы можете сериализовать их в JSON следующим образом:
List<MyObjectClass> listOfObjects = new List<MyObjectClass>();
И затем используйте addParameter
:
requestREST.AddParameter("myAssocKey", JsonConvert.SerializeObject(listOfObjects));
И вам нужно будет установить формат запроса на JSON
:
requestREST.RequestFormat = DataFormat.Json;
Ответ №6:
Возможно, вам потребуется десериализовать ваш анонимный тип JSON из тела запроса.
var jsonBody = HttpContext.Request.Content.ReadAsStringAsync().Resu<
ScoreInputModel myDeserializedClass = JsonConvert.DeserializeObject<ScoreInputModel>(jsonBody);
Ответ №7:
Вот полный код приложения, работающего на консоли. Пожалуйста, установите пакет 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": "@Pamp;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.
}
}
}