[英]I get a Bad request Status Code 400 when I am trying to consume a REST API online using C#
[英]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.