Родной общий проект Xamarin HttpClient не работает
Я создал собственный общий проект Xamrin, поддерживающий мобильные платформы Android и iOS. Я хочу использовать REST-сервисы в обоих мобильных приложениях. Если я делаю запрос к REST API, используя HttpClient, то это не работает. Дает мне ответ как:
{StatusCode: 404, ReasonPhrase: "Not Found", версия: 1.1, Content: System.Net.Http.StreamContent, заголовки: { Vary: сервер принятия-кодирования: DPS/1.0.3 X-SiteId: 1000 Set-Cookie: dps_site_id=1000; путь =/ Дата: среда, 27 июля 2016 12:09:00 GMT Соединение: keep-alive Тип контента: text/html; charset=utf-8 Content-Length: 964 }} Содержимое: {System.Net.Http.StreamContent} Заголовки: { Vary: сервер принятия-кодировки: DPS/1.0.3 X-SiteId: 1000 Set-Cookie: dps_site_id=1000; путь =/ Дата: среда, 27 июля 2016 г. 12:09:00 GMT Соединение: keep-alive } IsSuccessStatusCode: false ReasonPhrase: "Not Found" StatusCode: System.Net.HttpStatusCode.NotFound Версия: {1.1} Непубличные участники:
Если я использую HttpWebResponse, чтобы сделать запрос, он успешно получает данные.
Подскажите, пожалуйста, почему не работает HttpClient?
// Using HttpClient
public async Task<string> GetCategories11(string token)
{
using (HttpClient client = new HttpClient())
{
var url = string.Format("{0}{1}", BaseUrl, CategoriesEndPoint);
var uri = new Uri(url);
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
try
{
using (var response = await client.GetAsync(uri))
{
if (response.IsSuccessStatusCode)
{
var contentStr = await response.Content.ReadAsStringAsync();
return contentStr;
}
else
return null;
}
}
catch
{
return null;
}
}
}
// Using HttpWebRequest
public async Task<ResponseModel> GetCategories(string token)
{
// Create an HTTP web request using the URL:
var url = string.Format("{0}{1}", RequestClient.BaseUrl, CategoriesEndPoint);
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri(url));
request.ContentType = "application/json";
request.Headers.Add("Authorization", "Bearer " + token);
request.Accept = "application/json";
request.Method = "GET";
try
{
// Send the request to the server and wait for the response:
using (HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync())
{
// Get a stream representation of the HTTP web response.
using (Stream stream = response.GetResponseStream())
{
// Use this stream to build a JSON object.
JsonValue jsonDoc = await Task.Run(() => JsonObject.Load(stream));
return new ResponseModel() { Success = true, ResponseValue = jsonDoc.ToString(), StatusCode = response.StatusCode };
}
}
}
catch (WebException ex)
{
using (var stream = ex.Response.GetResponseStream())
using (var reader = new StreamReader(stream))
{
return new ResponseModel() { ResponseValue = reader.ReadToEnd(), StatusCode = ((HttpWebResponse)ex.Response).StatusCode };
}
}
catch (Exception ex)
{
return new ResponseModel() { ResponseValue = ex.Message };
}
}
1 ответ
Отладка и пауза в сети using (var response = await client.GetAsync(uri))
что такое uri
? и это так же, как в GetCategories()?
Если вы предпочитаете, это метод, который я использую от Xamarin.Android, и он работает с токеном на предъявителя. Изменить в соответствии с вашими потребностями, вам может не потребоваться JsonConvert.DeserializeObject()
часть.
protected async Task<T> GetData<T>(string dataUri, string accessToken = null, string queryString = null)
{
var url = baseUri + "/" + dataUri + (!string.IsNullOrEmpty(queryString) ? ("?" + queryString) : null);
try
{
using (var httpClient = new HttpClient() { Timeout = new TimeSpan(0, 0, 0, 0, SharedMobileHelper.API_WEB_REQUEST_TIMEOUT) })
{
// Set OAuth authentication header
if (!string.IsNullOrEmpty(accessToken))
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
using (HttpResponseMessage response = await httpClient.GetAsync(url))
{
string content = null;
if (response != null && response.Content != null)
content = await response.Content.ReadAsStringAsync();
if (response.StatusCode == HttpStatusCode.OK ||
response.StatusCode == HttpStatusCode.Created)
{
if (content.Length > 0)
return JsonConvert.DeserializeObject<T>(content);
}
else if (response.StatusCode == HttpStatusCode.InternalServerError)
{
throw new Exception("Internal server error received (" + url + "). " + content);
}
else
{
throw new Exception("Bad or invalid request received (" + url + "). " + content);
}
}
}
}
catch (Exception ex)
{
Log.Error("Could not fetch data via GetData (" + url + ").", ex.ToString());
throw ex;
}
return default(T);
}