我编写了follow命令,将带有JSON数据的POST发送到服务器。服务器必须重定向我的请求并使用相同的数据发送GET:
curl -L -i -XPOST \
-d 'id=105' \
-d 'json={"orderBy":0,"maxResults":50}' http://mysite.com/ctlClient/
我得到回应:
HTTP/1.1 302 Found
Date: Thu, 04 Jul 2013 13:12:08 GMT
Server: Apache
X-Powered-By: PHP/5.3.19
Set-Cookie: PHPSESSID=1hn0g8d7gtfl4nghjvab63btmk2; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
location: http://mysite.com/fwf/online/
Content-Length: 0
Connection: close
Content-Type: text/html
HTTP/1.1 200 OK
Date: Thu, 04 Jul 2013 13:12:08 GMT
Server: Apache
X-Powered-By: PHP/5.3.19
Set-Cookie: PHPSESSID=16akc7kdcoet71ipjflk9o9cnm5; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 1
Connection: close
Content-Type: text/html
从访问日志中我看到:
"POST /ctlClient/ HTTP/1.1" 302 - "-" "Apache-HttpClient/4.1 (java 1.5)"
"GET /fwf/online/ HTTP/1.1" 200 1 "-" "Apache-HttpClient/4.1 (java 1.5)"
到目前为止一切顺利,
问题是GET
没有收到我添加到帖子中的数据。听起来像在重定向期间,我的数据以某种方式被驳回。 从Android客户端可以运行,因此不是服务器端问题。
将POST数据传递给GET请求需要做什么?
非常感谢,
[编辑]
@nif提议将CURL
升级到7.28.0。
仍然遇到同样的问题
[INFO]
我第一次去http://mysite.com/ctlClient/index.php
:
case 105: // id=105
session_unset();
session_start();
foreach($_POST as $key => $value){$_SESSION[$key] = $value;}
ctlGotoSameDomain("/fwf/online/"); // <- aka redirect
return true;
重定向后,我转到/fwf/online/index.php
,我的请求为空:
public function __construct() {
$this->json = isset($_SESSION['json']) ? $_SESSION['json'] : null;
msqLogFile("fwf/post", Array('post' => 'Request: '.$this->json));
}
http://mysite.com/ctlClient/index.php
正确获取2个参数:id
和json
答案 0 :(得分:7)
当curl跟随重定向并且请求不是普通的GET(例如POST或PUT)时,如果HTTP响应是301,302或303,它将使用GET执行以下请求。如果响应代码是任何其他3xx代码,curl将使用相同的未修改方法重新发送以下请求。
修改强>
我做了一些研究,发现它可能是你的卷曲版本的问题。较新的版本将遵循-XPOST
选项,并POST
也会转到重定向的位置。但旧版本有自己的选项,即--post301
和--post302
。根据他们的手册页:
- post301 告诉curl尊重RFC 2616 / 10.3.2并且不将POST请求转换为GET 跟随301重定向时的请求。非RFC行为无处不在 在Web浏览器中,所以curl默认进行转换以进行维护 一致性。但是,服务器可能需要POST才能在此之后保留POST 重定向。仅当使用-L, - location时,此选项才有意义 (在7.17.1中添加)
- post302 告诉curl尊重RFC 2616 / 10.3.2并且不将POST请求转换为GET 跟随302重定向时的请求。非RFC行为无处不在 在Web浏览器中,所以curl默认进行转换以进行维护 一致性。但是,服务器可能需要POST才能在此之后保留POST 重定向。仅当使用-L, - location时,此选项才有意义 (在7.19.1中添加)
<强>参考文献:强>
答案 1 :(得分:0)
我需要在我的脚本中添加-b
以启用Cookie。 CURL默认情况下不使用它们,此问题导致会话ID更改。因此没有数据传输。
curl -b -L -i -X POST \
-d 'id=105' \
-d 'json={"orderBy":0,"maxResults":50}' http://mysite.com/ctlClient/
现在正在运作