【问题标题】:Why does getHeaderField() return a String where as getHeaderFields() return Map<String,List<String>> in HttpUrlConnection为什么 getHeaderField() 返回一个字符串,而 getHeaderFields() 在 HttpUrlConnection 中返回 Map<String,List<String>>
【发布时间】:2017-09-01 14:50:49
【问题描述】:

我在我的 android 代码中使用 HttpUrlConnection,并且我正在尝试访问 getResponseCode() 调用后的标头字段。对于单个标头方法是 -

public String getHeaderField(String name)

在哪里获取所有标题 -

public Map<String,List<String>> getHeaderFields()

那么这里的交易是什么?我们可以多次设置标题吗?

getHeaderField() 方法的文档说 -

如果在多次设置相同标头且值可能不同的连接上调用,则仅返回最后一个值。

那么 getHeaderFields() 方法呢?如果有人可以举个例子来帮助理解差异,我将不胜感激。

与具有方法的 HttpResponse 相比 -

Header[] getHeaders(String var1);

我会想到方法-

public List<String> getHeaderField(String name)

但情况似乎并非如此。那么我该如何处理呢?

【问题讨论】:

  • 所以你想得到标题?键值对吗?
  • 问题是如何为单个标头设置多个值。如果是这样(在 HttpClient 以及 HttpUrlConnection 的 getHeaderFields 的情况下似乎是这种情况)我如何获取 HttpUrlConnection 中单个标头的值列表。
  • 请不要告诉我迭代并得到它:)
  • 标头值将仅作为字符串返回您有多个具有相同标头键的值,它将所有值作为一个字符串返回,用“;”分隔分号
  • 那么为什么是平价呢?可能是 [public String getHeaderField(String name)public Map&lt;String,String&gt; getHeaderFields())] 或 [public List&lt;String&gt; getHeaderField(String name)public Map&lt;String,List&lt;String&gt;&gt; getHeaderFields()]?

标签: java android httpclient httpurlconnection


【解决方案1】:

标头(不确定是否全部)可以有多个值,我不知道为什么 API 是这样设计的(getHeaderField() 返回由; 分隔的值,而getHeaderFields() 返回一个列表值,在我看来这是一个不一致的设计选择)。

好吧,要获取某个标头的值列表:getHeaderFields() 方法返回一个映射,因此如果您已经知道标头名称,则无需迭代,只需执行 getHeaderFields().get("headername") 即可获取列表该标头的值。

【讨论】:

  • 你确定getHeaderField() 只给出最后一个值吗?并不是所有都被; 隔开,正如@Basil 所建议的那样?
  • 你是对的,我误解了 javadoc:“如果在一个连接上调用多次设置相同的标头并使用可能不同的值,则只返回最后一个值。” - 我以为它返回最后一个值,但它实际上返回了最后一个 set。我已经更新了答案。
猜你喜欢
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 2020-11-12
  • 2015-09-04
  • 2010-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多