【问题标题】:Is it necessary to have content-type headers for content much like request headers in a PUT/POST request to web api是否有必要为内容提供内容类型标头,就像对 Web api 的 PUT/POST 请求中的请求标头一样
【发布时间】:2014-05-14 02:05:13
【问题描述】:

我是 web api 的新手,我正在编写一个代码,我在其中发送 json 数据,用于对 web api(web 服务)的 PUT/POST 请求。 我正在做以下事情

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri("http://localhost:9000/");
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    var gizmo = some json data;
    HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Post,"url");
    req.Content = new StringContent(some json data, Encoding.UTF8,"application/json"));
    client.Timeout = TimeSpan.FromSeconds(500);
    response = await client.PostAsJsonAsync("api/products", gizmo);
}

我的问题是我是否必须将内容类型的代码放在内容标题中,我观察到即使确实将内容类型作为“applicipn/json”专门用于我的代码中的内容类型 并在 Fiddler 中检查我的请求,它仍然显示内容类型:text/html。 为什么会这样?。 非常感谢您的所有回复

【问题讨论】:

    标签: c# asp.net-web-api dotnet-httpclient


    【解决方案1】:

    是的,您确实为内容类型添加了代码。您不必在 JSON 中包含的部分是接受,尽管我个人认为最好包含接受,因为它明确说明了意图,但您的里程可能会有所不同。

    这是我刚刚发现的一篇博文,解释了不这样做的一些问题: http://truncatedcodr.wordpress.com/2012/09/05/asp-net-web-api-always-set-content-type/

    编辑:

    见 cmets。显然,您不必再指定内容类型。无论如何,至少在大多数企业软件中,显式编码优于隐式编码。原因很简单:当你使用隐式编码时,代码的意图往往会丢失。请注意,我并不是说“不要使用可用的抽象”,因为允许 Microsoft(或开源开发团队)接管您的应用程序并使用它们提供的抽象来简化和使用它们并没有错。减少你的代码。如果您依赖默认值,而不是设置值,则会产生一些未来风险,应该考虑这一点。在某些情况下,值得冒险。今天的趋势是尽可能多地使用隐式编码,因为它可以节省击键次数。作为一名顾问,我可以证明这往往是未来问题的核心。

    【讨论】:

    • 实际上我在寻找我的问题的答案时确实看到了这篇文章,问题是如果深入到这篇文章的底部,人们已经发布了他们的 cmets,最初这篇文章是在 2012 年 9 月写的然后他的 cmets 中的一个人(写于 2013 年 12 月)说不再需要在您的代码中提供内容类型,可能是因为 web api 在 1 年内的进步。即从 09/ 2102 至 2013 年 12 月。
    • @user2913184 - 很高兴知道。总的来说,我仍然喜欢显式编码,因为它带来的惊喜更少。
    • 我已经更新了上面的代码,所以在只包含内容类型之后,我仍然遇到同样的旧错误,并且“响应”对象说错误代码 405 方法不允许。
    • @user2913184 - 你检查过 Fiddler 中的请求和响应吗?我使用 REST 端点执行此操作,否则您几乎没有反馈。运行查询,然后遍历请求以确保它没有遗漏任何内容。我还将检查另一端(服务)以确保没有错误地设置配置元素。当我把头撞到墙上时,我经常会找到一个可行的示例,然后根据我的代码对其进行调整。事后分析,我将工作代码与我原来的代码进行了比较,这样我就可以理解出了什么问题。
    • 我得到的第二个惊喜是,当我分析我对 web api.Fiddler 的调用时说这是一个 PUT 请求,尽管我在上面的代码中专门定义了 HttpMethod.Post。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 2013-09-09
    • 2018-05-07
    • 2017-04-27
    • 2021-07-30
    • 2015-02-28
    • 2017-04-07
    相关资源
    最近更新 更多