如何解决 Http 401 错误,但在邮递员中工作,而不是在 xamarin 表单中工作

Posted

技术标签:

【中文标题】如何解决 Http 401 错误,但在邮递员中工作,而不是在 xamarin 表单中工作【英文标题】:how to solve Http 401 error,but working in postman,not working in xamarin forms 【发布时间】:2019-06-22 05:29:19 【问题描述】:

我正在尝试通过 API 调用访问数据。身份验证要求是:

身份验证令牌需要在标题名称 ACCESS-TOKEN 下的调用中作为标题传递。 注意:将 Content-Type 添加为 Application/JSON

var uri = new Uri(string.Format("https://stg-api.oyorooms.ms/api/v2/hotels/get_availability/"));
var json = JsonConvert.SerializeObject(action);
var content = new StringContent(json, Encoding.UTF8, "application/json");

HttpResponseMessage response = null;
if (isNewItem)

    // client.BaseAddress = new Uri("https://stg-api.oyorooms.ms/api/v2/hotels/get_availability/");
    client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("ACCESS-TOKEN", "c19.....j5XeS0=");
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "relativeAddress");
    request.Content = new StringContent(content.ToString(),
            Encoding.UTF8,
            "application/json");
    response = client.PostAsync(uri, content).Result;

    resp = response.Content.ToString();//for getting break points

var resp1 = response.Content.ToString();//for getting break points

if (response.IsSuccessStatusCode)

    string responsedone = await response.Content.ReadAsStringAsync();
    var Items = JsonConvert.DeserializeObject<List<OyoSearchData>>(responsedone);
    var ids = Items[0].Hotels.Hotel[0].ID;

我得到的回应是:

StatusCode: 401, ReasonPhrase: 'Unauthorized', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:

Connection: close,  Transfer-Encoding
Date: Sat, 22 Jun 2019 05:33:41 GMT
Server: nginx/1.14.1
Transfer-Encoding: chunked
X-android-Received-Millis: 1561181624449
X-Android-Response-Source: NETWORK 401
X-Android-Selected-Protocol: http/1.1
X-Android-Sent-Millis: 1561181624232
Content-Type: application/json;charset=UTF-8

为什么会出现此错误?我的访问令牌没有与标头一起发送吗?请帮忙。

我试过的其他代码是:

public async Task GetOyoApiDataCall(OyoHotelavailability action, bool isNewItem = false)

    string resp = null;
    try
    

        var uri = new Uri(string.Format("https://stg-api.oyorooms.ms/api/v2/hotels/get_availability/"));

        client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("ACCESS-TOKEN", "c19.......W5XeS0=");
        var json = JsonConvert.SerializeObject(action);
        var content = new StringContent(json, Encoding.UTF8, "application/json");

        HttpResponseMessage response = null;
        if (isNewItem)
        
            response = client.PostAsync(uri, content).Result;
            resp = response.Content.ToString();//for getting break points
        
        var resp1 = response.Content.ToString();//for getting break points

        if (response.IsSuccessStatusCode)
        
            string responsedone = await response.Content.ReadAsStringAsync();
            var Items = JsonConvert.DeserializeObject<List<OyoSearchData>>(responsedone);
            var ids = Items[0].Hotels.Hotel[0].ID;
        
    
    catch (Exception e)
    
    

遇到同样的错误。

【问题讨论】:

【参考方案1】:

您的问题是,根据您的代码,您实际上并没有设置表单的 HTTP 标头:

访问令牌:c19.......W5XeS0=

基于代码行client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("ACCESS-TOKEN", "c19.......W5XeS0=");,您正在做的是创建表单的标题:

授权:A​​CCESS-TOKEN c19.......W5XeS0=

相反,您需要添加一个名为 ACCESS-TOKEN 的自定义标头。 @LibinJoseph 在这个主题上有一个nice answer。基本上,您只需将有问题的行替换为以下形式的行:

client.DefaultRequestHeaders.Add("ACCESS-TOKEN","c19.......W5XeS0=");

希望对你有帮助!

【讨论】:

如果有效,请考虑接受答案。 :-) 听起来像是另一个问题,如果你想不通的话,如果你在这里问,但绝对是一个单独的问题。 :-) client.DefaultRequestHeaders.Add("ACCESS-TOKEN", "cURTM..t4QWQ="); response = client.PostAsync(uri, content).Result;在这种情况下出现未经授权的错误,但在 var response = await client.GetAsync(uri); 中完美运行; 为什么不进入 PostAsync(uri, content)。请帮助任何人。 对于最后一条评论,我不确定,但我建议您提出一个新的单独问题,因为这会引起更多关注。可能除了我之外没有人会看到你上面的评论。

以上是关于如何解决 Http 401 错误,但在邮递员中工作,而不是在 xamarin 表单中工作的主要内容,如果未能解决你的问题,请参考以下文章

状态:401 在邮递员中未经授权

上传音频文件时,API 在邮递员中工作,但在 android 应用程序中不工作

Webservice 在 Android Retrofit 中不工作,但在 Postman 和 Swift / iOS 中工作,得到 401 Unauthorized

Django Rest Framework - response.set_cookie() 不在浏览器中设置 cookie,但在邮递员和可浏览 api 中工作

Javascript - 无法发布数据(使用 axios),而它在邮递员中工作。为啥?

调用.Net API时如何解决邮递员中的401未授权错误