2010-11-24 3 views
1

Я пишу приложение .NET, которое будет разговаривать с JSON-API, чтобы вытащить/сдвинуть данные. Я видел аналогичный вопрос: Consuming a RESTful JSON API using WCFComsuming REST (JSON) API с использованием WCF

, но мне нужно немного больше информации по тому же вопросу. Вот JSON, что я должен послать в запросе:
{ "логин": { "пароль": "ПАРОЛЬ", "Имя пользователя": "USERNAME"}}

и ответ JSON будет что-то вроде:
{ "ответ": { "статус": "OK", "маркер": "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 в первый раз, поэтому я больше не знаю об этом.

+0

Все это выглядит хорошо. Ваша проблема заключается в внедрении службы. Отправьте его здесь, и мы сможем помочь. – Aliostad

+0

Как выглядит ваш класс LoginResponse? Он украшен атрибутами DataContract/DataMember? – Garett

+0

Это класс LoginResponse: public class LoginResponse { общедоступный токен строки {get; задавать; } } – Zamacho

ответ

0

Ваш класс LoginResponse должен выглядеть как-то так:

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

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

EDIT:

Кроме того, клиент должен быть настроен на использование webHttpBinding и endpoint behavior должны быть настроены на использование webHttp, как в следующем примере example.

+0

Хорошо, что я прочитал эту статью раньше, а моя привязка и поведение конечных точек такие же, как описано в этой статье. Теперь я добавил атрибуты DataContract/DataMember в LoginResponse, но объект ответа равен null. Fiddler показывает, что мой запрос был успешным, и я получаю токен в ответе http, но WCF не может выполнить синтаксический анализ ответа. – Zamacho

0

Перейти к библиотеке клиентов Microsoft.Http из папки lib в проекте this или из пакета Starter Kit для 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.

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