2014-09-09 1 views
1

Я попытался подключиться к своему API с помощью RestSharp. Когда я пытаюсь с этим кодом:RestSharp на Windows Phone 8 не получил ответа

var client = new RestClient("http://api.com"); 
var request = new RestRequest("api/login", Method.POST); 
client.Authenticator = new HttpBasicAuthenticator("login", "pass"); 
request.AddHeader("Accept", "*/*"); 
request.RequestFormat = DataFormat.Json; 
request.AddBody(new { customer = new { email = "email", password = "pass" } }); 
var response = client.Execute(request); 
Console.WriteLine(response.Content); 
Console.ReadKey(); 

я получил правильный ответ от сервера

Но когда дело доходит до Windows Phone 8

var client = new RestClient("http://api.com"); ; 
client.Authenticator = new HttpBasicAuthenticator("login", "pass"); 
var request = new RestRequest("api/login", Method.POST); 
request.AddHeader("Accept", "*/*"); 

request.RequestFormat = DataFormat.Json; 
request.AddBody(new { customer = new { email = "email", password = "pass" } }); 

client.ExecuteAsync(request, response => 
{ 
    lblStatus.Text = response.Content ; 
}); 

Я получил код состояния не найден, сервер нуль. Что я сделал не так?

+0

* «Я получил код статуса не найден» * где? Вызывается ли исключение? –

+0

Я проверяю его в часах при отладке –

ответ

3

Я думаю, что вы должны послать запрос synchronyously. Просто создать класс, который выглядит следующим образом:

public static class RestClientExtensions 
{ 
    public static Task<IRestResponse> ExecuteTask(this IRestClient client, RestRequest request) 
    { 
     var TaskCompletionSource = new TaskCompletionSource<IRestResponse>(); 
     client.ExecuteAsync(request, (response, asyncHandle) => 
     { 
      if (response.ResponseStatus == ResponseStatus.Error) 
       TaskCompletionSource.SetException(response.ErrorException); 
      else 
       TaskCompletionSource.SetResult(response); 
     }); 
     return TaskCompletionSource.Task; 
    } 
} 

И теперь, вы будете иметь возможность использовать его как это:

IRestResponse restResponse = await app.Client.ExecuteTask(request); 

После этой линии вы можете легко получить содержание ответа, как и вы сделайте это раньше:

lblStatus.Text = response.Content ; 

Надеюсь, это вам поможет.

1

в коде

var client = new RestClient(basicUrl); 
client.ExecuteAsync<User>(request, (response) => 
     { 
      user = response.Data; 
     }); 
txtBox.Text = user.Name; //<---- its outside the Async event handler 
         //so at this point user doesn't  
         //have the info of the response 

вам нужно изменить эту строку внутри метода ответа асинхронного

+0

, но, к примеру, хочу сделать что-то вроде этого. 'RestConnector rc = новый RestConnector(); rc.executeLogin(); user = rc.user; ' Мой rc.user имеет значение null, как я могу его избежать? В executeLogin я получил свой код, который я разместил выше. –