繁体   English   中英

C# REST Api 在我通过 HttpClient 调用 ZDB974238714CA8DE634ACEClient 时总是返回 401 状态码

[英]C# REST Api always return 401 status code when i am calling API by HttpClient

我第一次与纳斯达克基金网络数据服务合作。 我正在调用他们的 API 之一,其中传递用户 ID、密码和访问密钥,但总是得到 401 状态代码。 我无法弄清楚我的 http 通话中有什么问题。 请有人看一下代码并告诉我我在哪里犯了错误,我得到的是 401 状态代码而不是正确的响应。

这是我无法共享实际凭据和访问密钥的示例代码。 给出代码

string url = "sample url";
Uri u = new Uri(url);

string username = "test1";
string password = "test2";
string accessKey = "myaccesskey";

var payload = new Dictionary<string, string>
{
  {"username", username},
  {"password", password},
  { "accessKey", accessKey}
};

string strPayload = JsonConvert.SerializeObject(payload);
//HttpContent c = new StringContent(strPayload, Encoding.UTF8, "application/json");
HttpContent c = new StringContent(strPayload, Encoding.UTF8, "application/x-www-form-urlencoded");

var response = string.Empty;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11;
using (var client = new HttpClient())
{
    HttpRequestMessage request = new HttpRequestMessage
    {
        Method = HttpMethod.Post,
        RequestUri = u,
        Content = c
    };

    var result = client.SendAsync(request).Result;
    if (result.IsSuccessStatusCode)
    {
        response = result.StatusCode.ToString();
    }
}

我得到这个错误

{StatusCode:401,ReasonPhrase:'检查用户名/密码或访问密钥',版本:1.1,内容:System.Net.Http.StreamContent,标题:{ Pragma:no-cache X-Frame-Options:SAMEORIGIN Cache-Control:无缓存日期:2022 年 8 月 10 日,星期三 11:55:36 GMT 内容长度:0
过期:-1 }}

这可能是您对服务进行身份验证的方式。 一种确认方法是通过 Postman 进行测试。 测试它有效吗?

您应该将访问令牌添加到您的 Header 而不是内容中。

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

老实说,我们需要更多信息。 API 期待什么? 似乎它期待 FormData 并且您正在发送 JSON 字符串作为 StringContent。

尝试以下操作:

var url = "https://nfn.nasdaq.com/servicecall/tempsession";
var username = new StringContent("test1");
var password = new StringContent("test2");
var accessKey = new StringContent("myaccesskey");

var formData = new MultipartFormDataContent
                {
                    { username, "username" },
                    { password, "password" },
                    { accessKey, "accessKey" }
                };

using (var client = new HttpClient())
{
    var response = await client.PostAsync(url, formData);

    response.EnsureSuccessStatusCode();
}

尝试以下操作以提取您作为响应收到的 JWT 令牌。

    var url = "https://nfn.nasdaq.com/servicecall/tempsession";

    var formDataDictionary = new Dictionary<string, string>
    {
        { "username", "test1"},
        { "password", "test2"},
        { "accessKey", "myaccesskey"}
    };

    var formData = new FormUrlEncodedContent(formDataDictionary);

    using (var client = new HttpClient())
    {
        var response = await client.PostAsync(url, formData);

        response.EnsureSuccessStatusCode();

        var result = await response.Content.ReadAsStringAsync();

        var responseBody = JObject.Parse(result);
        var accessToken = responseBody["data']"].Value<string>();
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM