curl是一个很好很强大的工具,但PHP并不自带这个类库,而且我们只是要实现POST方法,杀鸡焉用牛刀。纯PHP就能实现,还没有兼容性的问题。
这个函数是,有了它我们就可以非常方便地实现POST提交了。下面是一个可以直接使用的函数
- /**
- * @param $url string | 要提交的URL地址
- * @param $data array | 要提交的POST数据
- * @param $optional_headers | 基本上这个不用理会
- */
- function post_request($url, $data, $optional_headers = null)
- {
- $params = array('http' => array(
- 'method' => 'POST',
- 'content' => http_build_query($data),
- ));
- if ($optional_headers !== null)
- {
- $params['http']['header'] = $optional_headers;
- }
- $ctx = stream_context_create($params);
- $fp = @fopen($url, 'rb', false, $ctx);
- if (!$fp)
- {
- throw new Exception("Problem with $url");
- }
- $response = @stream_get_contents($fp);
- if ($response === false)
- {
- throw new Exception("Problem reading data from $url");
- }
- return $response;
- }
很简单吧,你或许会问,stream_context_create这个函数的参数是从何而来的,有一份详细的说明。
我们也可以通过stream_context_create这个函数来实现代理功能。代理的重要性就不用多说了吧
- <?php
- $opts = array('http' => array('proxy' => 'tcp://127.0.0.1:8080', 'request_fulluri' => true));
- $context = stream_context_create($opts);
- $data = file_get_contents('', false, $context);
- echo $data;
- ?>
甚至可以使用它来上传文件
- $fileHandle = fopen("someImage.jpg", "rb");
- $fileContents = stream_get_contents($fileHandle);
- fclose($fileHandle);
- $params = array(
- 'http' => array
- (
- 'method' => 'POST',
- 'header'=>"Content-Type: multipart/form-data\r\n",
- 'content' => $fileContents
- )
- );
- $url = "";
- $ctx = stream_context_create($params);
- $fp = fopen($url, 'rb', false, $ctx);
- $response = stream_get_contents($fp);
这下应该不用再为POST发愁了吧