2013-05-27 2 views
16

Я создаю клиент API RESTful в C# .NET 3.5.Как получить доступ к телу запроса HTTP с помощью RestSharp?

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

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

У кого-нибудь есть решение?

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

ответ

34

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

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

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

См. Код для RestRequest класс here.

Вот что RestSharp docs on ParameterType.RequestBody должен сказать:

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

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

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

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

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

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

+1

Отлично, спасибо! Существует полный рабочий код: http://pastebin.com/0c4bqPNW – Epoc

Смежные вопросы