为什么go http post得到的结果与curl post不同?

为什么go http post得到的结果与curl post不同?,go,Go,我正在尝试实现一个RESTAPI登录过程。我已经用curl验证了这个过程 使用curl,以下命令将进行登录: $ curl -i -X POST https://the-service.mycompany.com/login -d username=<my username> -d password=<mypassword> HTTP/1.1 200 Connection established HTTP/1.1 302 Access-Control-Allow-Cr

我正在尝试实现一个RESTAPI登录过程。我已经用curl验证了这个过程

使用curl,以下命令将进行登录:

$ curl -i -X POST  https://the-service.mycompany.com/login -d username=<my username> -d password=<mypassword>
HTTP/1.1 200 Connection established

HTTP/1.1 302
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE, PUT, PATCH
Access-Control-Max-Age: 3600
Access-Control-Allow-Headers: x-requested-with, content-type, authorization, X-RateLimit-App, X-Spinnaker-Priority
Access-Control-Expose-Headers: X-AUTH-REDIRECT-URL
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Set-Cookie: SESSION=ODdmNGZjZmEtY2EwOC00YzA4LWFmMmYtMjAwNDI1ODM2NjI3; Path=/; HttpOnly; SameSite=Lax
Location: http://the-service.mycompany.com
Content-Length: 0
Date: Thu, 18 Jul 2019 14:38:40 GMT
它返回的响应与curl-get不同,这意味着响应头和响应体完全不同

我注意到,curl返回两个状态码,200和302。但是go代码的相应状态是200

go代码输出为:

"POST /login HTTP/1.1\r\nHost: the-service.mycompany.com\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 36\r\nAccept: */*\r\nContent-Type: application/x-www-form-urlencoded\r\nAccept-Encoding: gzip\r\n\r\nusername=myuser&password=mypass"
"GET /login HTTP/1.1\r\nHost: the-service.mycompany.com\r\nUser- Agent: Go-http-client/1.1\r\nAccept: */*\r\nContent-Type: application/x-www-form-urlencoded\r\nReferer: http://the-service.mycompany.com/login\r\nAccept-Encoding: gzip\r\n\r\n"
Dump response ==================
200 
Access-Control-Allow-Origin: [*]
Access-Control-Max-Age: [3600]
Cache-Control: [no-cache, no-store, max-age=0, must-revalidate]
Date: [Thu, 18 Jul 2019 14:53:07 GMT]
Access-Control-Allow-Credentials: [true]
Content-Type: [text/html;charset=UTF-8]
X-Xss-Protection: [1; mode=block]
Pragma: [no-cache]
X-Frame-Options: [DENY]
X-Content-Type-Options: [nosniff]
Access-Control-Allow-Headers: [x-requested-with, content-type, authorization, X-RateLimit-App, X-Spinnaker-Priority]
Access-Control-Expose-Headers: [X-AUTH-REDIRECT-URL]
Expires: [0]
Content-Length: [1324]
Access-Control-Allow-Methods: [POST, GET, OPTIONS, DELETE, PUT, PATCH]

从输出来看,在do post之前,请求是一个post,但是在dump resp.request中,它变成了GET,为什么?

最后我解决了这个问题。让我做一个自我回答,希望它能帮助未来的人,如果他们遇到类似的问题

实际上,在我的例子中,curl没有自动重定向,因为我没有对curl使用-L选项。但是go POST确实自动重定向了

因此,我添加了一个CheckRedirect函数来阻止重定向:

func check(req *http.Request, via []*http.Request) error {
    return http.ErrUseLastResponse
}

... in main() ...

    client := http.Client {
        CheckRedirect: check,
    }

然后client.PostForm返回与curl相同的302结果。

http.Post返回了什么?@TieDad:与任何客户端一样,在线路上检查它,或者将请求发送给将其打印出来的东西。这两种方法都应该创建几乎相同的请求,服务器根据用户代理返回不同的结果并非闻所未闻。@TieDad Go可能也得到了302,并遵循它。是的,他们在做同样的事情,只是以不同的方式告诉你。他们都发出POST,得到302响应重定向,然后在重定向之后放置一个新的get请求,然后从中得到200。
func check(req *http.Request, via []*http.Request) error {
    return http.ErrUseLastResponse
}

... in main() ...

    client := http.Client {
        CheckRedirect: check,
    }