text / html vs application / x-www-form-urlencoded和FormUrlEncodedMediaTypeFormatter

时间:2012-07-29 13:43:40

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

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

  

组oauth_token = XXXXXXXXXXXXXXXXXXXXXXXXX&安培; oauth_token_secret = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&安培; oauth_callback_confirmed =真

我通过System.Net.Http.HttpClient提出了此请求,我可以通过FormUrlEncodedMediaTypeFormatterFormDataCollection作为FormUrlEncodedMediaTypeFormatter阅读,但事实证明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 }); } 仅支持应用/默认情况下,x-www-form-urlencoded 格式。所以,我使用以下代码解决了这个问题:

FormUrlEncodedMediaTypeFormatter

这里的问题是:

响应提供者(在这种情况下是Twitter)是通过将此响应发送为 text / html 还是{{1}}支持 text / html 默认输入?

2 个答案:

答案 0 :(得分:3)

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

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

在Web API中,通过内容协商的工作方式,它会查看

  1. Mediatype映射(我认为在您的情况下不适用)
  2. 接受标题 - 查看您未设置的请求
  3. 请求内容类型 - 再次查看您的请求,而不是设置它以使其为空
  4. 格式化程序可以序列化给定类型
  5. 因此,如果您在显示任何Web API操作时发出请求,它将返回text / xml(如果您没有手动调整连接)。

答案 1 :(得分:3)

我同意Filip的说法,这对于不正确的内容类型标题是一个很好的解决方法。

的Henrik