php - CURL无法正确将POSTFIELDS发送到某些服务器

原文 标签 php json curl

我尝试搜索,其他答案对我没有帮助。

我正在尝试通过cURL发送POST数据,但仅在某些服务器上有效。是什么赋予了?

我试过了:

if (!empty($data) && $usePost) {
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
}


$data包含一个键为products和JSON字符串值的数组。

我还尝试使用查询显式:

if (!empty($data) && $usePost) {
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
}


但是,接收服务器上的$_POST却给了我NULL

知道该怎么办吗?

这是整个方法:

public static function execCommand($command, $ch,$data=array(),$cookie_file='genCookie.txt', $usePost = false) {
    $url = $command;
    if (!empty($data) && !$usePost)
        $url .= '?' . http_build_query($data);
    elseif (isset($data['sessionid'])) {
        $url .= '?sessionid=' . $data['sessionid'];
        unset($data['sessionid']);
    }

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20100101 Firefox/21.0');
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

    if (!empty($data) && $usePost) {
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    }

    return curl_exec($ch);
}


我尝试回显$_REQUEST,所以它不是在$_GET中。我也尝试了file_get_contents('php://input'),但还是没有。

发送端和接收端都在Apache服务器上。

更大的事情是,它可以在大多数服务器上运行,但是只有少数服务器忽略了它。有没有更安全,更跨平台的方法?

最佳答案

我发现很难相信Curl不会将“ post”字段发送到某些服务器(您共享的代码看起来还可以)。我宁愿假定您在这些服务器上处理POST的方式有问题,或者在其他地方做错了。

您可以使用tcpdump进行故障排除

$ sudo tcpdump -nl -w - -s0 -A -c 500 tcp port 80 | strings


现在,如果您运行示例代码,例如:

<?php

class Curl {

    protected static function getCurlHandler( $url, $data = false, $headers = false ) {
        $ch =  curl_init(); 

        curl_setopt( $ch, CURLOPT_URL, $url );
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
        curl_setopt( $ch, CURLOPT_HEADER, 0 );

        if( $headers ) {
            curl_setopt($ch, CURLINFO_HEADER_OUT, true);
            curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );
        }

        if( $data ) {
            curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $data ) );
        }

        return $ch;
    }

    protected static function exec( $ch ) {
        $output = curl_exec( $ch );

        // handle errors

        curl_close( $ch );
        return $output;
    }

    public static function get( $url, $headers = array() ) {
        $ch = self::getCurlHandler( $url, false, $headers );

        return self::exec( $ch );
    }

    public static function post( $url, $data = array(), $headers = array() ) {
        $ch = self::getCurlHandler( $url, $data, $headers );
        curl_setopt( $ch, CURLOPT_POST, 1 );

        return self::exec( $ch );
    }

    public static function put( $url, $data = array(), $headers = array() ) {
        $ch = self::getCurlHandler( $url, $data, $headers );
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");

        return self::exec( $ch );
    }

    public static function delete( $url, $data = array(), $headers = array() ) {
        $ch = self::getCurlHandler( $url, $data, $headers );
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");

        return self::exec( $ch );
    }

}


Curl::post( "http://www.google.com", array('q' => 'hello world'));


您应该在TCPDUMP输出中找到类似的内容

POST / HTTP/1.1
Host: www.google.com
Accept: */*
Content-Length: 13
Content-Type: application/x-www-form-urlencoded
q=hello+world


最后一行是最有趣的一点,清楚地表明CURL发送了具有所需数据的POST请求。

相关文章:

javascript - 带方法的JSON对象的正确术语是什么?

svn - 使用curl将文件从Subversion目录复制到UNIX服务器中的某个位置时出现身份验证错误

php - Ajax POST请求返回int而不是字符串

php - 如何从MySQL数据库获取SQL查询的所有行到PHP中的数组

javascript - 从Laravel干净地传递大型JSON数组到Javascript

javascript - RSS JSON显示的Javascript功能无法获取正确的个人资料图片

java - 如何存储JSON数组变量和打印特定值。 (JAVA)

php - 使用PHP cURL在开源应用程序上安装ssl

curl - 使用Curl和Oauth 2将文件上传到DropBox的DropBox API PUT示例

php - 将html属性值传递给php中的下一个脚本