在JAVA HttpUrlConnection中,请求Header设置的主要逻辑代码如下:
public synchronized void set(String k, String v) {
for (int i = nkeys; --i >= 0;)
if (k.equalsIgnoreCase(keys[i])) {
values[i] = v;
return;
}
add(k, v);
}
验证密钥应该是唯一的,密钥必须与值保持一对一的映射关系。
相反,在响应模块的HeaderFields中,结构被定义为Entry>。也就是说,密钥不会与值保持一对一的映射关系。
这是为什么? HTTP协议是否有相关协议?
添加: 在HttpClient4中,请求Header设置的主要逻辑代码如下:
/**
* Replaces the first occurence of the header with the same name. If no header with
* the same name is found the given header is added to the end of the list.
*
* @param header the new header that should replace the first header with the same
* name if present in the list.
*/
public void updateHeader(final Header header) {
if (header == null) {
return;
}
// HTTPCORE-361 : we don't use the for-each syntax, i.e.
// for (Header header : headers)
// as that creates an Iterator that needs to be garbage-collected
for (int i = 0; i < this.headers.size(); i++) {
final Header current = this.headers.get(i);
if (current.getName().equalsIgnoreCase(header.getName())) {
this.headers.set(i, header);
return;
}
}
this.headers.add(header);
}
回应标题
/**
* Gets all of the headers with the given name. The returned array
* maintains the relative order in which the headers were added.
*
* <p>Header name comparison is case insensitive.
*
* @param name the name of the header(s) to get
*
* @return an array of length >= 0
*/
public Header[] getHeaders(final String name) {
final List<Header> headersFound = new ArrayList<Header>();
// HTTPCORE-361 : we don't use the for-each syntax, i.e.
// for (Header header : headers)
// as that creates an Iterator that needs to be garbage-collected
for (int i = 0; i < this.headers.size(); i++) {
final Header header = this.headers.get(i);
if (header.getName().equalsIgnoreCase(name)) {
headersFound.add(header);
}
}
return headersFound.toArray(new Header[headersFound.size()]);
}
它们与HttpUrlConnection相同
答案 0 :(得分:6)
HTTP协议是否有相关协议?
是。 RFC 2616 Section 4.2 "Message Headers"说:
具有相同字段名称的多个消息头字段可以是 当且仅当整个字段值出现在消息中时出现 标题字段定义为以逗号分隔的列表[即#(值)]。 必须可以将多个标题字段合并为一个 &#34; field-name:field-value&#34;对,不改变语义 消息,通过将每个后续字段值附加到第一个,每个 用逗号分隔。头字段具有相同的顺序 因此收到字段名称是重要的 解释组合字段值,因此代理不得 转发邮件时更改这些字段值的顺序。
这进一步扩展为RFC 7230 Section 3.2.2 "Field Order":
发件人不得生成具有相同字段的多个标头字段 在消息中命名,除非该字段的整个字段值 标题字段定义为以逗号分隔的列表[即#(值)] 或标题字段是一个众所周知的例外(如下所述)。
收件人可以将多个标题字段与同一字段组合在一起 将名称命名为一个&#34;字段名称:字段值&#34;一对,没有改变 消息的语义,通过附加每个后续字段值 合并的字段值按顺序,用逗号分隔。订单 其中接收到具有相同字段名称的头字段 因此对组合领域的解释具有重要意义 值;代理不得更改这些字段值的顺序 转发消息。