Использование API REST (JSON) с использованием WCF - PullRequest
1 голос
/ 25 ноября 2010

Я пишу приложение .NET, которое будет взаимодействовать с API на основе JSON для извлечения / извлечения данных.Я видел похожий вопрос, заданный ранее: Использование RESTful JSON API с использованием WCF

, но мне нужно немного больше информации по той же теме.Вот JSON, который я должен отправить в запросе:{ "Логин": { "пароль": "ПАРОЛЬ", "имя": "USERNAME"}}и ответ JSON будет примерно таким:{"response": {"status": "OK", "token": "o9b0jrng273hn0"}}

Вот что я придумал:

[ServiceContract]
public interface ITestApi
{
    [OperationContract]
    [WebInvoke( Method = "POST",
        BodyStyle = WebMessageBodyStyle.Wrapped,
        RequestFormat = WebMessageFormat.Json,
        ResponseFormat = WebMessageFormat.Json,
        UriTemplate = "/login"
        )]
    LoginResponse Login( LoginRequest login );
}

, где LoginRequest имеет имя пользователяи свойства пароля, и LoginResponse имеет свойство токена.

Когда я вызываю API, запрос выполняется успешно, и я получаю ответ обратно, как и ожидалось (я проверил это с помощью Fiddler).Но WCF не может создать объект LoginResponse для меня.это всегда ноль.Я полагаю, что я делаю что-то неправильно, может кто-нибудь указать мне, что я должен сделать, чтобы понять это правильно?

Это правильный способ создания клиента службы REST на основе JSON?Я использую RESTful API впервые, поэтому у меня нет больше знаний об этом.

Ответы [ 2 ]

0 голосов
/ 25 ноября 2010

Получите клиентскую библиотеку Microsoft.Http из папки lib в этом проекте или из стартового комплекта WCF REST. Используя это вы можете сделать:

var client = new HttpClient();
var content = HttpContent.Create("{'login':{'password':'PASSWORD','username':'USERNAME'}}", "application/json");
var response = client.Post("http://service.com/login",content);
var jsonString = response.Content.ReadAsString();

Если вы не хотите читать Json как строку и анализировать что-то вроде Json.Net и предпочитаете использовать DataContracts, вы можете сделать:

var loginResponse = response.Content.ReadAsJsonDataContract<LoginResponse>();

Использование каналов WCF на клиенте для работы со службами REST просто причинит вам гораздо больше боли, чем вы действительно хотите. Вам гораздо лучше придерживаться простого HTTP.

0 голосов
/ 25 ноября 2010

Ваш класс LoginResponse должен выглядеть примерно так:

[DataContract]
public class LoginResponse 
{ 
    [DataMember]
    public string token { get; set; } 
}

Он должен быть снабжен атрибутами DataContract и DataMember , чтобы сериализатор ( DataContractJsonSerializer в случае JSON) знал, как его сериализовать.

EDIT:

Также ваш клиент должен быть настроен на использование webHttpBinding , а поведение конечной точки должно быть настроено на использование webHttp, как в следующем примере .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...