繁体   English   中英

难以接收来自 API 的 HTTP 响应 — 错误请求错误

[英]Difficulty receiving an HTTP Response from API — Bad Request Error

我正在尝试将用户名/密码从应用程序传递到 API 以接收令牌授权密钥。 当我尝试这样做时,我收到 400 Bad Request 错误,我不知道为什么。 以下是有问题的方法:

public User UserAuthentication(string username, string password)
{
    string endpoint = baseURL + "/TOKEN";

    // Could be POST maybe
    string method = "POST";

    Credential jsonObj = new Credential
                         {
                            grant_type = "password",
                            username = username,
                            password = password
                         };

    string jsonStr = JsonConvert.SerializeObject(jsonObj);

    WebClient wc = new WebClient();

    //x - www - form - urlencoded
    wc.Headers[HttpRequestHeader.ContentType] = "application/x - www - form - urlencoded";
    wc.Headers.Add("Access-Control-Allow-Headers", "content-type");
    wc.Headers.Add("Access-Control-Allow-Origin", "*");
    wc.Headers[HttpRequestHeader.Authorization] = "Bearer <token>";
    wc.Headers.Add("Access-Control-Allow-Methods", "POST, PUT, GET, DELETE, OPTIONS");

    string header = wc.Headers.ToString();

    try
    {
        string response = wc.UploadString(endpoint, method, jsonStr);
        return JsonConvert.DeserializeObject<User>(response);
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}

我已经在这个方法中改变了几乎所有的东西来寻找修复。

我做了什么:

  • /TOKEN 是 /values & /api/values
  • POST 方法是 GET —— 有了这个,我收到“无法发送带有这种动词类型的内容主体”。 错误。
  • ContentType 更改为“应用程序/json”
  • Access-Control-Allow-Origin 有 baseURL
  • 检查 header 和正文的格式:

Header:

{Content-Type: application/x - www - form - urlencoded
Access-Control-Allow-Headers: content-type
Access-Control-Allow-Origin: *
Authorization: Bearer <token>
Access-Control-Allow-Methods: POST, PUT, GET, DELETE, OPTIONS}

身体:

{"grant_type":"password",
"username":"test@gmail.com",
"password":"password123"}

我的请求显然有问题,我只是没有想法可以尝试。 我不完全确定 UploadString() 是否是在这种情况下使用的正确方法,但我在 WebClient class 中找不到另一种更好的方法。 任何帮助尝试将我推向正确方向的帮助将不胜感激。

所以我认为你正在尝试做的是一个带有用户名/密码授权的“令牌”端点的表单 urlencoded 帖子。 这些通常是这样完成的:

using (var request = new HttpRequestMessage(HttpMethod.Post, new Uri("https://example.com/token"))
{
    Content = new FormUrlEncodedContent(new Dictionary<string, string>
    {
        { "grant_type", "password" },
        { "username", "username@site.com" },
        { "password", "password12345" }
    })
})
{
    using (var resp = await _client.SendAsync(request))
    {
        resp.EnsureSuccessStatusCode();
        //await resp.Content.ReadAsAsync<BearerToken>();
        // for testing purposes, try this:
        var returnData = await resp.Content.ReadAsStringAsync();
        Console.WriteLine(returnData);
    }
}

您应该在需要执行 Http 请求的所有范围之外定义它:

private static readonly HttpClient _client = new HttpClient();

所以,首先,尝试坚持使用HttpClient WebClient等其他模式被视为遗留模式。

接下来,当向服务器发送 OPTIONS 调用时,通常会从服务器返回 CORS 标头。 您在这里没有这样做,您永远不必担心从您的计算机运行的 C# 程序中的那种东西。 所以你可以放弃访问控制 header 的东西。

Form-urlencoded 数据不是 JSON 数据。 这是格式化数据的另一种方式。 如果你想发送 JSON 数据,你应该使用 content-type application/json

最后,您尝试添加Authorization header。 但这没有多大意义,因为您正在尝试验证自己以获得授权。 如果您发送正确的用户名/密码,您将收到一个不记名令牌,您可以在Authorization header 中使用该不记名令牌,以便将来对所述服务进行请求。

哦,我忘了补充:每当您在 [400,499] 范围内看到错误(在本例中为“400 - 错误请求”)时,这意味着发送了错误的内容,并且服务器不了解您要执行的操作。 例如:401 表示您发送的授权信息无效或缺失。 400 表示您的数据可能格式不正确。

但我喜欢你的问题......我可以看到你在做什么,你尝试了各种不同的事情。

如果您想了解 HTTP 的工作原理,请下载一个名为Fiddler的程序。 这是调试 HTTP 调用的好工具。

暂无
暂无

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

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