【问题标题】:StringContent vs ObjectContent字符串内容与对象内容
【发布时间】:2015-06-08 08:40:23
【问题描述】:

我正在使用 System.Net.Http 的 HttpClient 通过“POST”调用 REST API 使用以下代码:

using (HttpRequestMessage requestMessage = new HttpRequestMessage(
                                           HttpMethod.Post, new Uri(request)) { })
{
     response = await httpClient.PostAsync(request, objectContent);
}

“objectContent”目前是这个 -

objectContent = new ObjectContent(jsonContent.GetType(),
                                  jsonContent,
                                  new JsonMediaTypeFormatter());

我想知道如果这是 StringContent 而不是像这样的 ObjectContent 会有什么不同?

objectContent = new StringContent(content);
objectContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");

两者都工作正常。因为它是 JSON,所以我倾向于认为 StringContent 是有意义的。但是什么时候使用 ObjectContent,因为几乎所有发送的内容都是“字符串”。

【问题讨论】:

    标签: c# json serialization httpclient dotnet-httpclient


    【解决方案1】:

    我想知道如果这是一个 StringContent 会有什么不同 而不是像这样的 ObjectContent?

    在您的示例中不会有任何区别。 ObjectContent 仅允许通过 HttpClient 发送“更广泛”的类型范围,而 StringContent 仅适用于 string 值,例如 JSON。

    StringContentByteArrayContent 的一个精简包装器,实际上将传递的值存储为byte[]。您只需获得无需来回转换 string 的好处。

    编辑:

    鉴于您发布的是 JSON,您甚至可以使用 HttpClientExtensions.PostAsJsonAsync<T> 来减少冗长:

    await httpClient.PostAsJsonAsync(url, json);
    

    【讨论】:

    • 有道理。在我的情况下,响应总是期望来自 REST API 的“application/json”,因此我会选择 StringContent
    • @Patrick - 感谢您的关注。我错过了,正在回复评论。
    • @Lalman 也许PostAsJsonAsync 会是一种更好、更简洁的发布 JSON 的方法。查看我的编辑。
    • 我遇到了 PostAsJsonAsync 的问题,因为它不包括 ObjectContent 的 Content-Length。我的 Json 数据实际上并未发布到 API。它使用分块传输编码发布。有什么建议(除了恢复到 StringContent)?
    【解决方案2】:

    如果有人会搜索如何在 .NET Core 2.1 中通过 PostAsync 发送请求: 我没有在 HttpClient 中找到 PostAsJsonAsync 方法,但是您的解决方案设置:

    objectContent = new StringContent(content);
    objectContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
    

    在 .NET Core 中也能完美地“完成工作”。

    编辑:

    另外,如果您想添加自己的标题,您可以输入:

    objectContent.Headers.Add("Your header", "Value");
    

    【讨论】:

      【解决方案3】:

      ObjectContent 用于使用内置或自定义编写的格式化程序格式化更复杂的 Mime 类型。也可以将 ObjectContent 用于简单的字符串,除了性能(恕我直言,未检查)可能使用 StringContent 更好,因为它可能已经专门针对字符串进行了优化

      【讨论】:

      • 谢谢丹尼斯。我会进行性能测试以确定性能差异,如果有的话!
      • 我希望你也写过 how 来使用简单的字符串作为 ObjectContent。刚刚发现自己尝试使用一个通用函数来创建带有 ObjectContent 和 JsonMediaTypeFormatter 的 HTTPRequestMessage:new ObjectContent<TValue>(value, jsonFormatter);。但是当传递一个预序列化的 json 字符串作为值时,它会通过添加一堆“\”来混淆字符串。无论如何,我的搜索还在继续。
      • @micnil 使用 ObjectContent 时传递了一个 jsonFormatter。在您的情况下,您传递的那个添加了“\”。因此,您可以传递一个将由格式化程序序列化的非序列化对象,或者将格式化程序更改为另一个不添加“\”的格式化程序。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-05
      • 1970-01-01
      相关资源
      最近更新 更多