【问题标题】:Use GetAsync with username+password in header (REST API)在标头中使用带有用户名+密码的 GetAsync (REST API)
【发布时间】:2017-05-24 22:01:13
【问题描述】:

我需要通过 UserNamePassword 作为 header-key 来获取令牌。我在 Postman 中测试了 GET 方法,效果很好。但是我不能在我的 C# 代码中做同样的事情,因为我无法将 UserNamePassword 作为标题键发送。

在我的代码中,我使用了PostAsync(参见代码),但它不起作用,因为无论如何(result.IsSuccessStatusCode) 总是false。所以我想我必须使用GetAsync 才能让它工作。但我不知道如何将UserNamePassword 作为标头值传递。

我的LoginVm 只包含UserNamePassword

    public static async Task<Token> Authentication(LoginVm vm) {

        Token token = null;

        string requestJson = JsonConvert.SerializeObject(vm);
        var client = new HttpClient();

        //How to use GetAsync instead?
        var result = client.PostAsync(new Uri("http://x.com/.../login"),
                                      new StringContent(requestJson, Encoding.UTF8, "application/json")).Result;

        if (result.IsSuccessStatusCode) { 
            string json = await result.Content.ReadAsStringAsync();
            if (!string.IsNullOrEmpty(json)) {

                token = JsonConvert.DeserializeObject<Token>(json);
            }
        }
        return token;
    }

感谢所有帮助。

【问题讨论】:

  • 你的方法是异步的,所以你可以用var result = ().Result代替var result = await ()

标签: c# json visual-studio authentication xamarin


【解决方案1】:

这样的事情应该可以工作:

using(var client = new HttpClient())
{
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", yourCredentials)
    var responseString = await client.GetStringAsync(yourBaseUrl);
}

因为您提到GET 工作正常。 然后假设你有一个这样的 Token 类:

public class Token
{
    public string Duration { get; set; }
    public string Token { get; set; }
}

您可以添加此行以反序列化响应:

var responseObject = JsonConvert.DeserializeObject<Token>(responseString);

并访问token

【讨论】:

  • 好的,谢谢。我是保留“基本”还是应该更换它?还。我不能像if(responseString.IsSuccessStatusCode)一样使用.IsSuccessStatusCode
猜你喜欢
  • 1970-01-01
  • 2019-05-07
  • 2021-07-09
  • 2021-08-01
  • 2016-08-17
  • 1970-01-01
  • 2015-03-13
  • 1970-01-01
相关资源
最近更新 更多