【问题标题】:text/html vs application/x-www-form-urlencoded and FormUrlEncodedMediaTypeFormattertext/html vs application/x-www-form-urlencoded 和 FormUrlEncodedMediaTypeFormatter
【发布时间】:2012-07-29 13:43:40
【问题描述】:

对于 POST 请求,我收到了 text/html 格式的响应,响应正文包含以下信息:

oauth_token=XXXXXXXXXXXXXXXXXXXXXXXXX&oauth_token_secret=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&oauth_callback_confirmed=true

我通过System.Net.Http.HttpClient 提出了这个请求,我可以通过FormUrlEncodedMediaTypeFormatter 将响应读取为FormDataCollection,但事实证明FormUrlEncodedMediaTypeFormatter 仅支持application/x-www-form-urlencoded 默认格式。因此,我使用以下代码解决了这个问题:

using (OAuthHttpClient client = new OAuthHttpClient(creds)) {

    var response = await client.PostAsync(requestUri, new EmptyContent());
    var formatter = new FormUrlEncodedMediaTypeFormatter();
    formatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
    var result = await response.Content.ReadAsAsync<FormDataCollection>(new List<MediaTypeFormatter>() { formatter });

}

这里的问题是:

响应提供者(在本例中是 Twitter)是否以 text/html 形式发送此响应做错了,还是应该 FormUrlEncodedMediaTypeFormatter 支持 text/html 类型默认?

【问题讨论】:

  • POST 中的 Accept Header 是什么?
  • @AlexanderZeitler 这是一个非常明智的评论。没有,我没有发送任何内容并收到此回复。我会尽量明确一点,看看这次它给了我什么。
  • 顺便说一句,你不会回来application/x-www-form-urlencoded,因为FormUrlEncodedMediaTypeFormatter 不能写任何东西。它是只读的,您可以查看CanWriteType method
  • @AlexanderZeitler 我将其设置为 application/json 以查看它的行为,我得到了相同的响应。
  • @AlexanderZeitler 我不想让FormUrlEncodedMediaTypeFormatter 写任何东西。

标签: http rest oauth asp.net-web-api dotnet-httpclient


【解决方案1】:

您的问题缺少一些关键信息,即默认情况下 requestUri 应该返回什么,是 Web API 服务还是外部服务等。它似乎不是 Web API,因为它返回“text/html”有点奇怪”。

但是 FormUrlEncodedMediaTypeFormatter 不支持从 text/html 返回格式这一事实绝对没问题。因为为什么会这样? "application/x-www-form-urlencoded" 实际上是一个键值字典,而 text/html 是一种富媒体类型。

在 Web API 中,内容协商的工作方式是

  1. 媒体类型映射(我认为在您的情况下没有)
  2. 接受标头 - 查看您的请求,您没有设置它们
  3. 请求内容类型 - 再次查看您的请求,您没有设置它,所以它是空的
  4. 格式化程序能否序列化给定类型

因此,如果您向任何 Web API 操作发出请求,它将返回 text/xml(如果您没有手动调整 conneg)。

【讨论】:

  • 问题是关于 FormUrlEncodedMediaTypeFormatter 而不是 conneg。响应从 Twitter OAuth 服务器返回。
  • 所以我包括了答案 - 但是 FormUrlEncodedMediaTypeFormatter 不支持从 text/html 格式化回来的事实绝对没问题。因为为什么会这样? “application/x-www-form-urlencoded”实际上是一个键值字典,而 text/html 是一种富媒体类型。我提到 conneg 是因为我不确定响应是来自 Web API 还是来自外部服务
  • 我也是这么想的。我认为响应提供者 (Twitter) 将此响应作为 text/html 发送是错误的。
  • 完全正确。只是 Twitter 发送格式为“application/x-www-form-urlencoded”的响应完全错误,并且用“text/html”内容类型错误地装饰。你的工作非常好。
【解决方案2】:

我同意 Filip 的观点,这是解决不正确内容类型标题的好方法。

亨里克

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-11
    • 2019-02-04
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 2018-11-26
    • 2018-11-17
    相关资源
    最近更新 更多