curl在重定向后对所有请求使用POST

时间:2017-01-27 09:01:29

标签: http redirect curl

根据文档和关于SO curl的一些类似问题,应遵循使用GET方法的重定向,除非将--post30x指定为参数。然而,这是我测试的结果

curl -kvv -b /tmp/tmp.BEo6w3GKDq -c /tmp/tmp.BEo6w3GKDq -X POST -H "Accept: application/json" -L https://localhost/api/v1/resource

> POST /api/v1/resource HTTP/1.1
> User-Agent: curl/7.29.0
> Host: localhost
> Cookie: JSESSIONIDSSO=AB59F2FD09D38EDBAACB726CF212EA2E; JSESSIONID=743FD68B520840094B6D283A81CF3CFA
> Accept: application/json
> 
< HTTP/1.1 302 Found
< Server: Apache-Coyote/1.1    
< Strict-Transport-Security: max-age=15768000; includeSubDomains
< Cache-control: no-cache, no-store
< Pragma: no-cache
< Location: https://testserver.int/api/v1/resource
< Content-Length: 0
< Date: Fri, 27 Jan 2017 08:41:05 GMT
<
> POST /api/v1/resource HTTP/1.1
> User-Agent: curl/7.29.0
> Host: testserver.int
> Cookie: JSESSIONID=1tcxpkul4qyqh1hycpf9insei9
> Accept: application/json

我希望第二个请求实际上是使用GET而不是POST。

curl's man page说:

  

当curl遵循重定向并且请求不是普通的GET(for   示例POST或PUT),它将使用GET执行以下请求if   HTTP响应是301,302或303.如果响应代码是任何响应   其他3xx代码,curl将使用相同的方式重新发送以下请求   未修改的方法。

     

您可以告诉curl不要将非GET请求方法更改为GET   通过使用专用选项进行30倍响应后:   --post301, - post302和--post303。

不幸的是,这不是我所看到的,并且没有--get30x的选项。

所以我的问题是 - 如何使curl遵循重定向响应(301/302/303),并在文档中写入对位置的GET请求?

我用curl / 7.29.0以及curl / 7.50.3进行了测试。

1 个答案:

答案 0 :(得分:13)

问题:您告诉curl使用-X POST这样做。正如-X的手册页部分解释了这一点:

The method string you set with -X, --request will be used for all requests, which
if you for example use -L, --location may cause unintended side-effects when curl
doesn't change request method according to the HTTP 30x response codes - and
similar.

修复:从命令行中删除-X POST。使用-d“”代替发送一个空的帖子,该帖子将在重定向后相应地调整为适当的方法。

更多:我的博文unnecessary use of curl -X中的解释和咆哮。