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
将cURL请求转换为http.request_Http_Go_Curl - Fatal编程技术网

将cURL请求转换为http.request

将cURL请求转换为http.request,http,go,curl,Http,Go,Curl,此cURL命令的工作方式应为: curl -i -v http://localhost:81/hallo * Trying ::1... * TCP_NODELAY set * Connected to localhost (::1) port 81 (#0) > GET /hallo HTTP/1.1 > Host: localhost:81 > User-Agent: curl/7.55.1 > Accept: */* > 1 -1 0* Connecti

此cURL命令的工作方式应为:

curl -i -v  http://localhost:81/hallo
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 81 (#0)
> GET /hallo HTTP/1.1
> Host: localhost:81
> User-Agent: curl/7.55.1
> Accept: */*
>
1 -1 0* Connection #0 to host localhost left intact
现在,我尝试在go服务中执行相同的http请求,如下所示:

request, err := http.NewRequest("GET", "http://localhost:81/" + url.QueryEscape("Hallo"), nil)
    client := &http.Client{}
    resp, err := client.Do(request)
如果我运行go代码(我通过测试进行了尝试),它只会产生以下错误:
我只收到错误net/http:http/1.x传输连接断开:格式错误的http状态代码“-1”
。 (我最初尝试了
http.Get(myurl)
。这会生成相同的http请求。当前代码由生成)


有人能帮我理解为什么这两个请求会产生不同的结果吗?

对really服务器的请求和响应示例:

[@xxxx ~]# curl -v -i 10.103.118.178:40000/ready
* About to connect() to 10.103.118.178 port 40000 (#0)
*   Trying 10.103.118.178...
* Connected to 10.103.118.178 (10.103.118.178) port 40000 (#0)
> GET /ready HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 10.103.118.178:40000
> Accept: */*
>
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< date: Fri, 25 Dec 2020 01:43:05 GMT
date: Fri, 25 Dec 2020 01:43:05 GMT
< content-length: 2
content-length: 2
< content-type: text/plain; charset=utf-8
content-type: text/plain; charset=utf-8

<
* Connection #0 to host 10.103.118.178 left intact
ok
[@xxxx~]#curl-v-i10.103.118.178:40000/就绪
*即将连接()到10.103.118.178端口40000(#0)
*正在尝试10.103.118.178。。。
*连接到10.103.118.178(10.103.118.178)端口40000(#0)
>GET/ready HTTP/1.1
>用户代理:curl/7.29.0
>主持人:10.103.118.178:40000
>接受:*/*
>

您可以使用
-i
告诉curl在输出中包含标题。但是,我在curl输出中看不到任何有效的HTTP响应头。因此,您的服务器可能出现故障,没有做出有效的HTTP响应。因此Go程序正确地报告了这一点,它无法将其解释为有效的HTTP头。(它试图将其解释为HTTP响应头,但在应该显示状态代码的位置,它发现
-1
不是有效的HTTP响应代码)

您的Go代码生成一个请求
GEThttp://localhost:81/Hallo
,而您的curl请求是用于获取http://localhost:81/hallo
。服务器是否可能将路径视为区分大小写的?谢谢@Abhijit_K,我已将该命令添加到该命令的输出中。@Adrian谢谢Adrian。不,服务器不区分大小写。我试着使用力量()。它作为java服务器启动,如果调用localhost:81/,它将打印日志中的任何文本(以任何方式请求数据,即使我将请求url复制到浏览器中)。因此,服务器获取请求并应答它。但只有cURL命令打印出响应。与您的问题无关,但请注意
“http://localhost:81/“+url.queryscape(“Hallo”)
错误。如果要以这种方式构造URL的路径,应该使用
URL.PathEscape
url.QueryEscape
用于查询参数。嘿@Flimzy谢谢你的提示。我将把它改为url.PathEscape().Hey@fefe。我认为你是对的,服务器没有返回有效的头。但是我不能改变服务器,需要像现在这样使用它。您知道在没有有效HTTP头的情况下解析我的go代码中的响应的方法吗?您的服务器可能不是HTTP服务器,因此您不能使用HTTP客户端。因此,首先应该确定服务器使用的协议,然后找到该协议的客户机。如果没有客户机,那么您必须实现自己的客户机。