2013-05-27 13 views
16

Buduję klienta RESTful API w C# .NET 3.5.Jak uzyskać dostęp do treści żądania HTTP za pomocą RestSharp?

Najpierw zacząłem budować go ze starego dobrego HttpWebClient (i HttpWebResponse), mogłem robić, co chciałem. Byłem szczęśliwy. Jedyną rzeczą, na której utknąłem, była automatyczna deserializacja z odpowiedzi JSON.

Tak, słyszałem o wspaniałej bibliotece o nazwie RestSharp (104.1), która ułatwia rozwój klientów RESTful API i automatycznie deserializuje odpowiedzi JSON i XML. Zmieniłem cały mój kod, ale teraz zdaję sobie sprawę, że nie mogę robić rzeczy, które mogłem zrobić z HttpWebClient i HttpWebResponse, takich jak dostęp i edycja surowego ciała żądania.

Ktoś ma rozwiązanie?

Edycja: wiem, jak ustawić treść żądania (z request.AddBody()), moim problemem jest to, że chcę uzyskać ten ciąg body żądania, edytować go i ponownie ustawić go w żądaniu (aktualizując treść żądania na mucha)

Odpowiedz

34

Treść zapytania jest rodzajem parametru. Aby dodać jeden, można wykonać jedną z nich ...

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

Aby pobrać parametr ciała można szukać elementów w kolekcji req.Parameters gdzie Type jest równa ParameterType.RequestBody.

Zobacz kod dla RestRequest klasy here.

Oto co ma do powiedzenia RestSharp docs on ParameterType.RequestBody:

Jeśli ten parametr jest ustawiony, to wartość zostanie wysłana jako organ wniosku . Nazwa parametru jest ignorowana, podobnie jak dodatkowe parametry RequestBody - akceptowana jest tylko 1.

Element RequestBody działa tylko w przypadku żądań POST lub PUT, ponieważ tylko one w rzeczywistości wysyłają treść w postaci .

Jeśli GetOrPost parametry jak dobrze, będą one zastąpić RequestBody - RestSharp nie będzie łączyć je, ale to zamiast rzucać parametr RequestBody dalej.

Do odczytu/aktualizując parametr ciała on-the-fly, można spróbować:

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

Albo jeżeli to niemożliwe, należy utworzyć nową kopię obiektu RestRequest z innego organizmu.

+1

Doskonale, dzięki! Istnieje pełny działający kod: http://pastebin.com/0c4bqPNW – Epoc