当前位置: 首页 > 知识库问答 >
问题:

使用HttpClient将内容类型设置为“application/json”,并将对象添加到主体中

苏富
2023-03-14

我正在尝试使用HttpClient创建以下帖子,使用postman它工作正常,但我似乎无法在代码中复制它。我需要将标题内容类型设置为application/json,并在文章正文中包含一个对象

邮递https://mycompanyurl.com/authenticate

标题
键:内容类型,值:应用程序/json

正文{“username”:“someusername”,“password”:“somepassword”}

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中的反向代理,我可以捕获postman发出的原始调用,rest api会按预期返回一个结果:

邮递http://127.0.0.1:8888/v1/authenticateHTTP/1.1内容类型:application/json;charset=UTF-8缓存控制:无缓存邮差令牌:4db8f2dd-cbf0-413c-ad5b-20af0543a31d用户代理:邮差运行时间/7.6。0接受:/Host:127.0。0.1:8888接受编码:gzip,缩减内容长度:87连接:保持活动

{“用户名”:“用户名”,“密码”:“密码”}

我从HttpClient和使用小提琴手的调用如下,这不起作用,返回200,但它不正常工作,数据不被返回,我看不到有效载荷中的任何差异,这将使其余的api不响应预期。

邮递http://127.0.0.1:8888/v1/authenticateHTTP/1.1内容类型:application/json;字符集=utf-8主机:127.0。0.1:8888内容长度:87预期:100继续连接:保持活动状态

{“用户名”:“用户名”,“密码”:“密码”}

共有1个答案

江超英
2023-03-14

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

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"}

希望这能有所帮助。

 类似资料:
  • 问题内容: 我正在尝试在Sinatra应用程序中编写基于JSON的Web API。我想发布一个JSON对象作为发布正文(设置了正确的内容类型),但是我很挣扎。 在可可中,我会做类似的事情 然后将内容类型设置为JSON,然后将HTTP正文作为JSON对象发布。我正在尝试使用jQuery。到目前为止,我能做的最好的就是将JSON对象转换为普通样式的文章正文,而这 并不是 我所追求的。 我的Javasc

  • 我试图向另一个接受内容类型“application/json-patch+json”的API发出补丁rest请求。我正在使用Spring的webclient,但我无法让它工作。我不断得到“415不支持的媒体类型” 我试过下面的; 我也试过: 对于这两种情况,我看到以下错误; 它似乎变成了'application/x-www-form-urlencoded;charset=utf-8',是否可能对此

  • 是否可以将“默认内容类型”设置为“application/json;v=2.0”。我说 default 是因为我使用的是 HttpClient 类,并且我使用 DefaultRequestHeaders 将我的代理设置为默认值。 我按照这个例子来创建我的头https://stackoverflow.com/a/10679340/196526,但是我也使用版本控制,关于版本控制的信息保存在内容类型中

  • 问题内容: 我有一个映射有以下注释的控制器: 我返回了一个有效的JSON字符串,但是,当我在浏览器中的Chrome Dev Tools上查看响应时,内容类型不是唯一的。为什么未设置内容类型? 我的: 我的: 使用WildFly 8.1作为我的应用服务器。 问题答案: 要了解的第一件事是,在元素 仅用于限制请求处理程序的映射。 它什么也没做。 然后,假设您的方法的返回类型为,并带有注释,则将通过处理

  • 我有一个用以下注释映射的控制器: 我返回一个有效的JSON字符串,但是,当我在浏览器中的Chrome Dev Tools上查看响应时,内容类型不是,而是简单的。为什么没有设置内容类型? 我的: 我的: 使用Wildfly8.1作为我的应用服务器。

  • 问题内容: 我正在使用字符串生成器将文本追加到我的JTextPane上,我将内容类型设置为,但是实际上没有文本出现在我的JTextPane上。 这是我的附加示例: 我做错什么了吗?我该如何解决它? 问题答案: 每次被称为新的内容类型被确定。以开头的文本,您已经有了HTML。 在您的情况下,将创建一个新文档HTMLDocument。 @mKorbel:每次JTextPane都将创建以下HTML。