Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未使用PUT方法在Golang http客户端请求中设置内容长度标头_Http_Go_Put_Content Length - Fatal编程技术网

未使用PUT方法在Golang http客户端请求中设置内容长度标头

未使用PUT方法在Golang http客户端请求中设置内容长度标头,http,go,put,content-length,Http,Go,Put,Content Length,我使用的是Golang 1.4.2(从源代码构建),当我试图通过HTTP.Client.Do()发出HTTP PUT请求时,请求中缺少内容长度头。我的所有其他标题都已发送。。。我做错什么了吗?当我通过CURL发出相同的请求时,就会发送content-length头。我的请求正在发送到etcd服务器,该服务器正在将我的所有密钥设置为空值。虽然这有点新奇,但几乎没有用处。:) 屈服 PUT /v2/keys/somekey HTTP/1.1 Host: localhost Content-Type

我使用的是Golang 1.4.2(从源代码构建),当我试图通过HTTP.Client.Do()发出HTTP PUT请求时,请求中缺少内容长度头。我的所有其他标题都已发送。。。我做错什么了吗?当我通过CURL发出相同的请求时,就会发送content-length头。我的请求正在发送到etcd服务器,该服务器正在将我的所有密钥设置为空值。虽然这有点新奇,但几乎没有用处。:)

屈服

PUT /v2/keys/somekey HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
X-Content-Length: 33

ttl=&value=WHOAH+here+is+my+stuff

如果您说header
Content Length
未设置(实际上它是自动设置的,只是在转储时未显示),则它会按设计工作,因为在
httputil.DumpRequest()
中排除了以下头,即使您显式地设置了它们:

  • 主机
  • 内容长度
  • 传输编码
  • 拖车
请参阅go/src/net/http/httputil/dump.go的部分


如果您发送请求而不是转储请求,您将看到标题
内容长度
用户代理
接受编码一起发送
我对未发送的内容长度不正确,我只是在使用httputil.DumpRequest时没有看到它


这里的解决方案是使用httputil.DumpRequestOut,它正确地显示了内容长度头(和其他头)。这意味着在我的程序中发生了其他事情,导致etcd设置空值。如果我弄明白了,我也会用这个解决方案更新。

ehrm。。。您转储的请求似乎设置了
内容类型
标题。代码正在运行。这不是问题。考虑到问题的其余部分,我怀疑他指的是
内容长度
标题:这是输出中未包含的标题。如果缺少的是内容长度,则需要DumpRequestOut,因为该标题不是您可以覆盖的标题,由传输设置。@JimB DumpRequestOut是我需要的。谢谢NewRequest for the application.yes,因此不需要在上述代码中设置内容长度头。它只是从
httputil.DumpRequest()
之后的转储结果中去掉这些头,尽管这个头仍然存在。总体问题与HTTP请求无关,而是我用于etcd响应的json标记。我将json存储在一个etcd键/值中,并将其传递到json.RawMessage类型,我认为这对于后续对该数据的json.Unmarshal调用会更好。然而,问题是json.RawMessage[]字节被引用了,所以我需要在解组之前取消引用。我决定改为使用字符串类型,并在传递到json.Unmarshal时转换为[]字节。
PUT /v2/keys/somekey HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
X-Content-Length: 33

ttl=&value=WHOAH+here+is+my+stuff