HttpClient post returns c# 中的错误请求,在 postman 中有效

HttpClient post returns bad request in c#, works in postman

我正在尝试访问休息端点,https://api.planet.com/auth/v1/experimental/public/users/authenticate。它在请求正文中期待 json。

我可以得到在 Postman 中工作的请求,但不能使用 c#。使用邮递员,我得到了预期的无效电子邮件或密码消息,但是无论我尝试什么,我的代码都得到 "Bad Request"。

这是发出请求的代码

private void Login()
{
    try
    {
        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri("https://api.planet.com/");
        client.DefaultRequestHeaders.Accept.Clear();
        //ClientDefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));
        Data.User user = new Data.User
        {
            email = "myemail@company.com",
            password = "sdosadf"
        };
        var requestMessage = JsonConvert.SerializeObject(user);
        var content = new StringContent(requestMessage, Encoding.UTF8, "application/json");
        var response = client.PostAsync("auth/v1/experimental/public/users/authenticate", content).Result;
        Console.WriteLine(response.ToString());
    }
    catch (WebException wex )
    {
        MessageBox.Show(wex.Message) ;
    }
}
class User
{
    public string email;
    public string password;
}

这是来自 Postman 的正在运行的屏幕截图

问题是您正在尝试调用 async 方法而不等待使用 await methodvar task = method; task.Wait() 的响应因此,当您最终执行 response.ToString() 时returns 您看到的文字。

在 non-async 方法中处理此问题的一种方法是执行以下操作:

var task = client.PostAsync("auth/v1/experimental/public/users/authenticate", content);
task.Wait();
var responseTask = task.Content.ReadAsStringAsync();
responseTask.Wait();
Console.WriteLine(responseTask.Result);

另一种方法是通过执行 private async void Login() 使当前方法异步,然后执行:

var postResp = await client.PostAsync("auth/v1/experimental/public/users/authenticate", content);
var response = await postResp.Content.ReadAsStringAsync();
Console.WriteLine(response);

实现此功能的方法是更改​​内容 header "content-type"。默认情况下 HTTPClient 正在创建 content-type: application/json;characterset= UTF8。我删除并重新创建了没有字符集部分的内容 header,它起作用了。

content.Headers.Remove("Content-Type");
content.Headers.Add("Content-Type", "application/json");

像这样创建一个方法...

    static async Task<string> PostURI(Uri u, HttpContent c)
    {            

        var response = string.Empty;
        var msg = "";
        using (var client = new HttpClient())
        {
            HttpResponseMessage result = await client.PostAsync(u, c);
             msg = await result.Content.ReadAsStringAsync();              
            if (result.IsSuccessStatusCode)
            {                   
                response = result.StatusCode.ToString();                    

            }
        } 
        return response;
    }

调用你的方法

public void Login()
    {
        string postData ="{\"email\":\"your_email\",\"password\":\"your_password\"}";
        Uri u = new Uri("yoururl");
        var payload = postData;

        HttpContent c = new StringContent(payload, Encoding.UTF8,"application/json");
        var t = Task.Run(() => PostURI(u, c));
        t.Wait();
        Response.Write(t.Result);
    }