2017-08-02 117 views
1

我知道這個問題可能看起來像重複,但我已經嘗試了所有解決方案之前,我再次問這個問題。Xamarin表單不發送授權標題

我正在嘗試使用Xamarin Forms中的C#HttpClient使用Django Rest框架編寫自己的REST API。該請求正在發送,但它不包括所需的授權令牌作爲方案。

這裏是我試過的東西:

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,也給了我的

在同一臺服務器響應「未提供身份驗證憑據。」 example.com

授權:令牌ffba1c43ac346945b788768e2a428d5e5d3c1fc9

緩存

由郵差

GET/API /問題/所有的HTTP/1.1

主機做出請求-Ctrol:no-cache

郵差令牌:0c1eb96d-d9d6-a9e7-0cfa-0444fdc0248e

通過HttpClient的

{Method: GET, RequestUri: 'https://example.com/api/issues/all', Version: 1.1, Content: <null>, Headers: { Authorization: Token ffba1c43ac346945b788768e2a428d5e5d3c1fc9 }} 

做出的請求,請注意,我用郵遞員,還設置正確測試的API Swagger,它在兩個上都可以正常工作。

會很高興,如果有人能在這裏給我一隻手,我覺得有可能是什麼我失蹤了

+0

您迴應嘗試使用普通的HttpWebRequest,HttpClient的有很多錯誤。 – Gusman

+0

@Gusman謝謝,我會檢查它,因爲我以前沒有使用它。 – phourxx

回答

0

儘量不要混用阻塞(.Result)和異步代碼。一路完成異步方法。

另外設置請求授權報頭時嘗試使用報頭來

request.Headers.Authorization = new AuthenticationHeaderValue(tokenType, token); 

重構方法的Authorization屬性

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; 
} 
+0

感謝您的快速響應,我已經嘗試過這一點,但會再次嘗試它希望它可以工作這一次約 – phourxx

+0

我剛剛嘗試了你的建議,而且我仍然得到相同的** 401 **響應代碼 – phourxx

+0

@ phourxx檢查使用代碼和郵遞員時發送的原始請求。然後比較看看可能導致問題的差異。 – Nkosi

0

好的,徹底檢查後,我發現我缺少尾隨斜槓在我的網址,服務器重定向我的請求從example.com/api/issues/allexample.com/api/issues/all/所以它沒有維護在重定向的同時標題。

最後,對於可能遇到同樣問題的其他人,或者可能嘗試使用API​​,您可能想要簽出Flurl,我可以完成整個請求並將json直接反序列化爲C#對象單行,很酷的權利?

感謝@Nkosi