Как получить доступ к телу HTTP-запроса с помощью RestSharp? - программирование
Подтвердить что ты не робот

Как получить доступ к телу HTTP-запроса с помощью RestSharp?

Я создаю клиент API RESTful в С#.NET 3.5.

Сначала я начал строить его с добрым старым HttpWebClientHttpWebResponse), я мог делать все, что хотел. Я был счастлив. Единственное, что я застрял, это автоматическая десериализация из ответа JSON.

Итак, я слышал о замечательной библиотеке RestSharp (104.1), которая облегчает разработку клиентов RESTful API и автоматически десериализует ответы JSON и XML. Я включил весь свой код, но теперь я понимаю, что не могу делать то, что я могу сделать с HttpWebClient и HttpWebResponse, например, получить доступ и отредактировать необработанный объект запроса.

У любого есть решение?

Изменить: я знаю, как установить тело запроса (с request.AddBody()), моя проблема в том, что я хочу получить эту строку тела запроса, отредактировать ее и повторно установить в запросе (обновление запросить тело на лету)

4b9b3361

Ответ 1

Тело запроса является типом параметра. Чтобы добавить один, вы можете сделать один из этих...

req.AddBody(body);
req.AddBody(body, xmlNamespace);
req.AddParameter("text/xml", body, ParameterType.RequestBody);
req.AddParameter("application/json", body, ParameterType.RequestBody);

Чтобы получить параметр body, вы можете искать элементы в коллекции req.Parameters где Type равен ParameterType.RequestBody.

Смотрите код для класса RestRequest здесь.

Вот что должны сказать документы RestSharp на ParameterType.RequestBody:

Если этот параметр установлен, его значение будет отправлено как тело запроса. Имя параметра игнорируется, равно как и дополнительные параметры RequestBody - только 1 принимается.

RequestBody работает только с запросами POST или PUT, поскольку только они фактически отправляют тело.

Если у вас также есть параметры GetOrPost, они перезапишут RequestBody - RestSharp не будет объединять их, а вместо этого выбрасывает параметр RequestBody.

Для чтения/обновления параметра body на лету вы можете попробовать:

var body = req.Parameters.FirstOrDefault(p => p.Type == ParameterType.RequestBody);
if (body != null)
{
    Console.WriteLine("CurrentBody={0}", body.Value);
    body.Value = "NewBodyValue";
}

Или, если это не удалось, создайте новую копию объекта RestRequest с другим телом.