7

我编写了以下命令以将带有 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。

仍然遇到同样的问题

[信息]

我第一次去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 个参数:idjson

4

2 回答 2

8

curl 的手册页

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

编辑

我做了一些研究,发现这可能是你的 curl 版本的问题。较新的版本将支持该-XPOST选项,并且也将POST重定向到重定向的位置。但是旧版本对此有自己的选择,即--post301--post302. 根据他们的手册页:

--post301 告诉 curl 在遵循 301 重定向时遵守 RFC 2616/10.3.2 并且不将 POST 请求转换为 GET 请求。非 RFC 行为在 Web 浏览器中无处不在,因此 curl 默认进行转换以保持一致性。但是,在这种重定向之后,服务器可能需要 POST 才能保持 POST。此选项仅在使用 -L、--location 时才有意义(在 7.17.1 中添加)

--post302 告诉 curl 在遵循 302 重定向时遵守 RFC 2616/10.3.2 并且不将 POST 请求转换为 GET 请求。非 RFC 行为在 Web 浏览器中无处不在,因此 curl 默认进行转换以保持一致性。但是,在这种重定向之后,服务器可能需要 POST 才能保持 POST。此选项仅在使用 -L、--location 时才有意义(在 7.19.1 中添加)

参考:

于 2013-07-04T13:47:03.233 回答
1

我需要添加-b到我的脚本以启用 cookie。CURL 默认不使用它们,这个问题导致会话 ID 更改。因此没有数据传输。

curl -b -L -i -X POST \
 -d 'id=105' \
 -d 'json={"orderBy":0,"maxResults":50}'  http://mysite.com/ctlClient/

现在它的工作

于 2013-07-05T06:59:36.367 回答