【问题标题】:use HttpClient to set the Content-Type to "application/json" and add object to the body使用 HttpClient 将 Content-Type 设置为“application/json”并将对象添加到正文
【发布时间】:2019-01-31 22:41:02
【问题描述】:

我正在尝试使用 HttpClient 创建以下帖子,使用邮递员使其正常工作,但我似乎无法在代码中复制它。我需要将标头 Content-Type 设置为 application/json 并在帖子正文中有一个对象。

发布https://mycompanyurl.com/authenticate

标题
Key:Content-Type,Value:application/json

身体 { “用户名”:“某个用户名”, “密码”:“某个密码” }

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri("https://companyurl.com");

    var serializedObject = JsonConvert.SerializeObject(
                          new {username = "username", password = "password" });
    var request = new HttpRequestMessage(HttpMethod.Post, "authenticate");
    request.Content = new StringContent(serializedObject, Encoding.UTF8,"application/json");                

    var response = await client.SendAsync(request);
    response.EnsureSuccessStatusCode();

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

}

使用 fidder 中的反向代理,我可以捕获来自邮递员的原始调用,该调用有效,其余 api 按预期返回结果:

POST http://127.0.0.1:8888/v1/authenticate HTTP/1.1 Content-Type: application/json;charset=UTF-8 cache-control: no-cache Postman-Token: 4db8f2dd-cbf0-413c-ad5b-20af0543a31d User-Agent: PostmanRuntime/7.6 .0 Accept: / Host: 127.0.0.1:8888 accept-encoding: gzip, deflate content-length: 87 Connection: keep-alive

{"用户名":"用户名","密码":"密码"}

我的来自 HttpClient 并使用 fiddler 的调用如下,这不起作用,返回 200 但它不能正常工作,没有返回数据,我看不到有效负载中的任何差异,这将使其余 api 无法按预期响应.

POST http://127.0.0.1:8888/v1/authenticate HTTP/1.1 Content-Type: application/json; charset=utf-8 Host: 127.0.0.1:8888 Content-Length: 87 Expect: 100-continue 连接: Keep-Alive

{"用户名":"用户名","密码":"密码"}

【问题讨论】:

  • 欢迎来到 Stack Overflow!这里不完全清楚你在问什么样的问题。你有任何错误吗?代码的某些部分是否不起作用?请阅读how to ask 一个问题。
  • 标头 Content-Type 为空,未设置
  • 你检查过这个吗? stackoverflow.com/questions/35907642/…

标签: c# rest api


【解决方案1】:

下面的逻辑应该生成与您的示例中提供的相同的工作请求签名(作为答案发布,请改为编辑您的问题),因此应该可以工作:

var clientHandler = new HttpClientHandler
{
    AutomaticDecompression = System.Net.DecompressionMethods.GZip | System.Net.DecompressionMethods.Deflate,
    AllowAutoRedirect = false
};

using (var client = new HttpClient(clientHandler, true))
{
    client.BaseAddress = new Uri("http://127.0.0.1:8888/v1/");

    client.DefaultRequestHeaders.Add("cache-control", "no-cache");
    client.DefaultRequestHeaders.Add("Postman-Token", "db8f2dd-cbf0-413c-ad5b-20af0543a31d");
    client.DefaultRequestHeaders.Add("User-Agent", "PostmanRuntime/7.6.0");
    client.DefaultRequestHeaders.Add("Accept", "*/*");
    client.DefaultRequestHeaders.ExpectContinue = false;

    var serializedObject = JsonConvert.SerializeObject(
        new { username = "username", password = "password" }
        );

    var request = new HttpRequestMessage(HttpMethod.Post, "authenticate")
    {
        Content = new StringContent(serializedObject, Encoding.UTF8, "application/json")
    };

    var response = await client.SendAsync(request);

    response.EnsureSuccessStatusCode();

    var content = await response.Content.ReadAsStringAsync();
}

它将创建以下请求:

POST http://127.0.0.1:8888/v1/authenticate HTTP/1.1
cache-control: no-cache
Postman-Token: db8f2dd-cbf0-413c-ad5b-20af0543a31d
User-Agent: PostmanRuntime/7.6.0
Accept: */*
Content-Type: application/json; charset=utf-8
Host: 127.0.0.1:8888
Content-Length: 45
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

{"username":"username","password":"password"}

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2022-01-01
    • 2012-05-22
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多