我创建了支持 Android 和 iOS 移动平台的 Xamrin 本机共享项目。我想在这两个移动应用程序中使用 REST 服务。如果我使用 HttpClient 向 REST API 发出请求,则它不起作用。给我的回应是:
{StatusCode:404,ReasonPhrase:'未找到',版本:1.1,内容:System.Net.Http.StreamContent,标头:{ 变化:接受编码服务器:DPS/1.0.3 X-SiteId:1000 Set-Cookie: dps_site_id=1000;路径=/ 日期:2016 年 7 月 27 日星期三 12:09:00 GMT 连接:keep-alive 内容类型:text/html;charset=utf-8 内容长度:964 }} 内容:{System.Net.Http.StreamContent} 标头:{Vary:Accept-Encoding Server:DPS/1.0.3 X-SiteId:1000 Set-Cookie:dps_site_id=1000 ; 路径=/ 日期:格林威治标准时间 2016 年 7 月 27 日星期三 12:09:00 连接:keep-alive } IsSuccessStatusCode:false ReasonPhrase:“未找到”状态代码: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 };
}
}