我知道这个问题可能看起来像是重复的,但在我再次提出这个问题之前,我已经尝试了所有解决方案。
我正在尝试使用我在Django Rest Framework中编写的REST API,使用Xamarin Forms中的C#HttpClient。该请求正在发送,但不包含授权所需的令牌作为方案。
以下是我尝试过的事情:
public async Task<IssueListModelView> FetchIssues(string token, string type)
{
client.BaseAddress = new Uri(XTMonitorContants.SERVICE_BASE_URL);
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, new Uri(XTMonitorContants.SERVICE_ISSUES_URL + type.ToLower()));
request.Headers.Add("Authorization", "Token " + token);
//client.
//client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Token", token);
client.DefaultRequestHeaders.Add("Authorization", "Token " + token);
var response = client.SendAsync(request);
var jsonString = response.ContinueWith(t => { return t.Result; }).Result.Content.ReadAsStringAsync().Result;
IssueListModelView resp = new IssueListModelView();
if (jsonString != "")
{
try
{
resp = JsonConvert.DeserializeObject<IssueListModelView>(jsonString);
}
catch (Exception)
{
resp.error = "Internal Server Error";
}
}
return resp;
}
我还试图直接发送请求而不使用 HttpRequestMessage ,但也给了我相同的服务器响应
&#34;未提供身份验证凭据。&#34;
邮递员提出的要求
GET / api / issues / all HTTP / 1.1
主持人:example.com
授权:令牌ffba1c43ac346945b788768e2a428d5e5d3c1fc9
缓存控制:无缓存
Postman-Token:0c1eb96d-d9d6-a9e7-0cfa-0444fdc0248e
HttpClient提出的请求
{Method: GET, RequestUri: 'https://example.com/api/issues/all', Version: 1.1, Content: <null>, Headers: { Authorization: Token ffba1c43ac346945b788768e2a428d5e5d3c1fc9 }}
请注意,我已经使用Postman正确测试了API并且还设置了Swagger,它在两者上都能正常工作。
如果有人能帮助我,我会很高兴,因为我认为可能是我错过了
答案 0 :(得分:0)
尽量不要混淆阻塞(.Result
)和异步代码。使方法始终保持异步。
同样在设置请求授权标头时,请尝试使用标题
上的Authorization
属性
request.Headers.Authorization = new AuthenticationHeaderValue(tokenType, token);
重构方法
public async Task<IssueListModelView> FetchIssues(string token, string type) {
client.BaseAddress = new Uri(XTMonitorContants.SERVICE_BASE_URL);
var uri = new Uri(XTMonitorContants.SERVICE_ISSUES_URL + type.ToLower());
var request = new HttpRequestMessage(HttpMethod.Get, uri);
request.Headers.Authorization = new AuthenticationHeaderValue("Token", token);
var response = await client.SendAsync(request);
var jsonString = await response.Content.ReadAsStringAsync();
IssueListModelView resp = new IssueListModelView();
if (jsonString != "") {
try {
resp = JsonConvert.DeserializeObject<IssueListModelView>(jsonString);
} catch (Exception) {
resp.error = "Internal Server Error";
}
}
return resp;
}
答案 1 :(得分:0)
好的,经过彻底检查后,我发现我的网址中缺少一个尾随斜线,服务器将我的请求从 example.com/api/issues/all 重定向到 example.com/api/issues/all / 所以在重定向时没有保留标题。
最后,对于可能遇到相同问题的其他人,或者可能尝试使用API,您可能想要签出Flurl,我能够完成整个请求并将json直接反序列化为C#用一条线对象,冷静吧?
感谢您的回复@Nkosi