RestSharp Опубликовать объект JSON

Я пытаюсь опубликовать следующий JSON с RestSharp:

{"UserName":"UAT1206252627",
"SecurityQuestion":{
    "Id":"Q03",
    "Answer":"Business",
    "Hint":"The answer is Business"
},
}

Я думаю, что я близок к этому, но, похоже, я борюсь с SecurityQuestion (API выдает ошибку о том, что параметр отсутствует, но не говорит, какой именно)

Это код, который у меня есть до сих пор:

var request = new RestRequest("api/register", Method.POST);
request.RequestFormat = DataFormat.Json;

request.AddParameter("UserName", "UAT1206252627");

SecurityQuestion securityQuestion = new SecurityQuestion("Q03");
request.AddParameter("SecurityQuestion", request.JsonSerializer.Serialize(securityQuestion));

IRestResponse response = client.Execute(request);

И мой класс контрольных вопросов выглядит так:

public class SecurityQuestion
{
    public string id {get; set;}
    public string answer {get; set;}
    public string hint {get; set;}

    public SecurityQuestion(string id)
    {
         this.id = id;
         answer = "Business";
         hint = "The answer is Business";
    }
}

Может ли кто-нибудь сказать мне, что я делаю неправильно? Есть ли другой способ опубликовать объект секретного вопроса?

Большое спасибо.


person JamesWillett    schedule 11.08.2015    source источник


Ответы (5)


Вам нужно указать тип содержимого в заголовке:

request.AddHeader("Content-type", "application/json");

Также AddParameter добавляется к строке запроса POST или URL на основе метода

Я думаю, вам нужно добавить его в тело следующим образом:

request.AddJsonBody(
    new 
    {
      UserName = "UAT1206252627", 
      SecurityQuestion = securityQuestion
    }); // AddJsonBody serializes the object automatically
person Oluwafemi    schedule 11.08.2015
comment
Спасибо за ваш ответ, Олувафеми, но я все еще получаю ту же ошибку (отсутствует параметр) - я знаю, похоже, что это должно работать, но могу ли я попробовать что-нибудь еще? - person JamesWillett; 11.08.2015
comment
Можете ли вы привести образец метода APl? - person Oluwafemi; 11.08.2015
comment
У меня это работает: request.AddHeader(Content-Type, application/json; charset=utf-8); request.AddJsonBody (ваш объект); - person AFD; 08.03.2016
comment
Спасибо за ваше решение - person Thomas.Benz; 30.08.2017
comment
Действительно не работает. Правильный подход: r.AddParameter("application/json", JsonSerializerHelper.Serialize(keys), ParameterType.RequestBody); - person lyolikaa; 07.12.2018
comment
Я передаю массив и получаю ответ "StatusCode: NotFound, Content-Type: , Content-Length: 0)" вот что я сделал: request.AddHeader(Content-type, application/json); request.AddJsonBody (код ветки); - person ThEpRoGrAmMiNgNoOb; 24.06.2019
comment
Не забудьте использовать @ с зарезервированными словами, например request.AddJsonBody(new { @event = "view" }); - person Konstantin; 05.11.2019

В очередной раз благодарим за помощь. Чтобы заставить это работать, мне пришлось отправить все как один параметр. Это код, который я использовал в конце.

Сначала я сделал пару классов под названием Request Object и Security Question:

public class SecurityQuestion
{
    public string Id { get; set; }
    public string Answer { get; set; }
    public string Hint { get; set; }
}

public class RequestObject
{
    public string UserName { get; set; }
    public SecurityQuestion SecurityQuestion { get; set; }
}

Затем я просто добавил его как один параметр и сериализовал в JSON перед публикацией, например так:

var yourobject = new RequestObject
            {
                UserName = "UAT1206252627",
                SecurityQuestion = new SecurityQuestion
                {
                    Id = "Q03",
                    Answer = "Business",
                    Hint = "The answer is Business"
                },
            };
var json = request.JsonSerializer.Serialize(yourobject);

request.AddParameter("application/json; charset=utf-8", json, ParameterType.RequestBody);

IRestResponse response = client.Execute(request);

и это сработало!

person JamesWillett    schedule 13.08.2015

Чтобы опубликовать необработанную строку тела json, методы AddBody() или AddJsonBody() не будут работать. Вместо этого используйте следующее

request.AddParameter(
   "application/json",
   "{ \"username\": \"johndoe\", \"password\": \"secretpassword\" }", // <- your JSON string
   ParameterType.RequestBody);
person Eternal21    schedule 04.04.2018
comment
Да, сырой подход много раз полезен, например, при передаче тела, которое хранится в базе данных - person BigMan73; 10.10.2018

Похоже, самый простой способ сделать это — позволить RestSharp выполнять всю сериализацию. Вам просто нужно указать RequestFormat вот так. Вот что я придумал для того, над чем я работаю. .

    public List<YourReturnType> Get(RestRequest request)
    {
        var request = new RestRequest
        {
            Resource = "YourResource",
            RequestFormat = DataFormat.Json,
            Method = Method.POST
        };
        request.AddBody(new YourRequestType());

        var response = Execute<List<YourReturnType>>(request);
        return response.Data;
    }

    public T Execute<T>(RestRequest request) where T : new()
    {
        var client = new RestClient(_baseUrl);

        var response = client.Execute<T>(request);
        return response.Data;
    }
person FunkySax    schedule 06.04.2018

RestSharp поддерживается из объекта методом AddObject

request.AddObject(securityQuestion);
person Amir Astaneh    schedule 03.03.2017