Использование RestSharp

Недавно я использовал RestSharp для использования своего Restful Resouce. и ожидаемый обмен данными с JSon между сервером и клиентом. Ниже мой код С#.

var client = new RestSharp.RestClient();
var request = new RestRequest(sUrl,Method.POST);
request.RequestFormat = DataFormat.Json;
request.Timeout =  TIME_OUT_MILLISECONTS ;
request.AddHeader("Content-Type", "application/json");
request.AddBody(new { appID = sAppId, loginName = sUserName, password=sPassword });
var response = client.Execute(request);
string s=response.Content;//It is always XML format.

Результат не тот, который я ожидал (формат данных Json), хотя я установил RequestFormat Json и добавил заголовок Http Content-Type. Поэтому я решил использовать .Net Reflector, чтобы узнать, что произошло в методе RestClient.Execute. Вот код метода.

public RestClient()
    {
        ...
        this.AddHandler("application/json", new JsonDeserializer());
        this.AddHandler("application/xml", new XmlDeserializer());
        this.AddHandler("text/json", new JsonDeserializer());
        this.AddHandler("text/x-json", new JsonDeserializer());
        this.AddHandler("text/javascript", new JsonDeserializer());
        this.AddHandler("text/xml", new XmlDeserializer());
        this.AddHandler("*", new XmlDeserializer());
        ...
    }

У меня есть несколько вопросов по этому поводу:

  1. Поскольку RestClient добавляет много видов Content-Type в HttpWebRequest. Это правильный способ построить запрос? И я думаю, может быть, это причина, по которой Response.Content всегда XML.

  2. Я не знаю, зачем RestClient нужно создавать такой HttpWebRequest. Есть ли смысл это делать?

  3. Если мы указали формат сообщения JSon и XML в Http-запросе, какой из них работает в конечном итоге? Это разрешено?

Спасибо. Хорошего дня.


person Joe.wang    schedule 23.08.2012    source источник


Ответы (1)


RestSharp будет использовать правильный обработчик в зависимости от типа содержимого ответа. Вот что делают эти AddHandler; его настройка RestClient для принятия определенных типов контента в ответе и сопоставление этих типов с десериализаторами. Обычно вы хотите установить заголовок accept для типа содержимого json, который уведомляет сервер об отправке json в ответе.

request.AddHeader("Accept", "application/json")

Конечно, это предполагает, что сервер, на который вы нажимаете, настроен на ответ с помощью json.

person Andrew Young    schedule 24.08.2012
comment
это предполагает, что сервер, на который вы нажимаете, настроен на ответ с помощью json. И когда это не так, а данные json возвращаются с ContentType text/html, добавляя следующий ответ (что я ищу уже несколько часов): RestClient.AddHandler("text/html", new JsonDeserializer()); через: groups.google.com /форум/#!topic/restsharp/_yjd2c093ks - person pc-pdx; 14.11.2014