Xamarin表示不发送授权标头

时间:2017-08-02 18:13:46

标签: c# rest web-services xamarin.forms

我知道这个问题可能看起来像是重复的,但在我再次提出这个问题之前,我已经尝试了所有解决方案。

我正在尝试使用我在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,它在两者上都能正常工作。

如果有人能帮助我,我会很高兴,因为我认为可能是我错过了

2 个答案:

答案 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