PHP + curl,HTTP POST示例代码?

任何人都可以告诉我如何做一个HTTP POST的PHP卷曲?

我想发送这样的数据:

username=user1, password=passuser1, gender=1

www.domain.com

我期望curl返回result=OK 。 有没有例子?


<?php
//
// A very simple PHP example that sends a HTTP POST to a remote site
//

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,"http://www.example.com/tester.phtml");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,
            "postvar1=value1&postvar2=value2&postvar3=value3");

// in real life you should use something like:
// curl_setopt($ch, CURLOPT_POSTFIELDS, 
//          http_build_query(array('postvar1' => 'value1')));

// receive server response ...
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$server_output = curl_exec ($ch);

curl_close ($ch);

// further processing ....
if ($server_output == "OK") { ... } else { ... }

?>

因为这个线程对于用PHP发送curl文件的结果很高,我想提供最有效的答案,因为上面和下面的所有其他人都做不必要的工作,而答案非常简单:

程序

// set post fields
$post = [
    'username' => 'user1',
    'password' => 'passuser1',
    'gender'   => 1,
];

$ch = curl_init('http://www.example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

// execute!
$response = curl_exec($ch);

// close the connection, release resources used
curl_close($ch);

// do anything you want with your response
var_dump($response);

面向对象

<?php
namespace MyAppHttp;

class Curl
{
    /** @var resource cURL handle */
    private $ch;

    /** @var mixed The response */
    private $response = false;

    /**
     * @param string $url
     * @param array  $options
     */
    public function __construct($url, array $options = array())
    {
        $this->ch = curl_init($url);

        foreach ($options as $key => $val) {
            curl_setopt($this->ch, $key, $val);
        }

        curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);
    }

    /**
     * Get the response
     * @return string
     * @throws RuntimeException On cURL error
     */
    public function getResponse()
    {
         if ($this->response) {
             return $this->response;
         }

        $response = curl_exec($this->ch);
        $error    = curl_error($this->ch);
        $errno    = curl_errno($this->ch);

        if (is_resource($this->ch)) {
            curl_close($this->ch);
        }

        if (0 !== $errno) {
            throw new RuntimeException($error, $errno);
        }

        return $this->response = $response;
    }

    /**
     * Let echo out the response
     * @return string
     */
    public function __toString()
    {
        return $this->getResponse();
    }
}

// usage
$curl = new MyAppHttpCurl('http://www.example.com', array(
    CURLOPT_POSTFIELDS => array('username' => 'user1')
));

try {
    echo $curl;
} catch (RuntimeException $ex) {
    die(sprintf('Http error %s with code %d', $ex->getMessage(), $ex->getCode()));
}

这里需要注意的是:最好用getResponse()方法创建一些名为AdapterInterface的接口,并让上面的类实现它。 然后,您可以随时将此实现与另一个类似的适配器交换,而不会对应用程序产生任何副作用。

使用HTTPS /加密流量

在Windows操作系统下,通常PHP的cURL存在问题。 在尝试连接到HTTPS保护的端点时,您会收到错误消息,告知您certificate verify failed

大多数人在这里做的是告诉cURL库忽略证书错误并继续( curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); )。 由于这会使你的代码工作,你会引入巨大的安全漏洞,并使恶意用户对你的应用程序执行各种攻击,如中间人攻击等。

永远不要这样做。 相反,您只需修改您的php.ini并告诉PHP您的CA Certificate文件的位置是否允许它正确验证证书:

; modify the absolute path to the cacert.pem file
curl.cainfo=c:phpcacert.pem

最新的cacert.pem可以从互联网下载或从您最喜爱的浏览器中提取。 当更改任何php.ini相关设置时,请记住重新启动您的网络服务器。


一个使用php curl_exec做一个HTTP帖子的实例:

把它放在一个名为foobar.php的文件中:

<?php
  $ch = curl_init();
  $skipper = "luxury assault recreational vehicle";
  $fields = array( 'penguins'=>$skipper, 'bestpony'=>'rainbowdash');
  $postvars = '';
  foreach($fields as $key=>$value) {
    $postvars .= $key . "=" . $value . "&";
  }
  $url = "http://www.google.com";
  curl_setopt($ch,CURLOPT_URL,$url);
  curl_setopt($ch,CURLOPT_POST, 1);                //0 for a get request
  curl_setopt($ch,CURLOPT_POSTFIELDS,$postvars);
  curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3);
  curl_setopt($ch,CURLOPT_TIMEOUT, 20);
  $response = curl_exec($ch);
  print "curl response is:" . $response;
  curl_close ($ch);
?>

然后使用命令php foobar.php运行它,它将这种输出转储到屏幕上:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Title</title>

<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<body>
  A mountain of content...
</body>
</html>

所以你做了一个PHP POST到www.google.com并发送了一些数据。

如果服务器被编程为读取变量后,它可以决定做一些不同的事情。

链接地址: http://www.djcxy.com/p/8601.html

上一篇: PHP + curl, HTTP POST sample code?

下一篇: REST with Spring and Jackson full data binding