2019独角兽企业重金招聘Python工程师标准>>>
在这篇文章中仅限于描述http请求调用接口的方式,我一直是在用thinkphp的框架开发,thinkphp的源码里面有自带的http的扩展类库。但是并没有包含http的请求(get或者post请求的接口调用),所以这个调用接口的类库是不要我自己来动手实现的。这个时候就需要我自己使用底层代码来实现了。
如果只是简单的请求,file_get_contents就够了,但是一般情况下调用接口我们会使用curl,开启php的curl的扩展配置。因为curl是支持post方式调用接口的,相对来说会更加安全,参数更多,功能更强。
file_get_contents的例子:
array(
'method' => 'POST',
'header' =>
"Content-type: application/x-www-form-urlencoded\r\n" .
"Content-length: $content_length\r\n",
'content' => $content
)
);
return file_get_contents($url, false, stream_context_create($options));
}
}
$data = array
(
'url' => 'http://www.waqiang.com/index.php/url/shorten',
'submit' => 'submit',
);
$response = Post('http://www.waqiang.com/index.php/url/shorten', $data);
$reg = '#[\'"](http:(//|\\/\\/)t\.cn((/|\\/)([^\'"/]+)(/|\\/)?|(/|\\/)))[\'"]#';
preg_match_all($reg, $response, $match);
var_dump($match);
?>
curl的例子:
$long_url,
'submit' => 'Submit'
);
$curlObj = curl_init();
$options = array(
CURLOPT_URL => $url,
CURLOPT_POST => TRUE, //使用post提交
CURLOPT_RETURNTRANSFER => TRUE, //接收服务端范围的html代码而不是直接浏览器输出
CURLOPT_TIMEOUT => 4,
CURLOPT_POSTFIELDS => http_build_query($data), //post的数据
);
curl_setopt_array($curlObj, $options);
$response = curl_exec($curlObj);
curl_close($curlObj);
return $response;
}
$result = shorturl('http://www.waqiang.com/index.php/url/shorten');
$reg = '#[\'"](http:(//|\\/\\/)t\.cn((/|\\/)([^\'"/]+)(/|\\/)?|(/|\\/)))[\'"]#';
preg_match_all($reg, $result, $match);
var_dump($match);
?>
还有一种方式,就是socket连接host发送请求,php中的函数会使用到fsockopen,fwrite,feof,fread,fclose这些。
socket方式例子【PHP fsockopen需要 PHP.ini 中 allow_url_fopen 选项开启。】:
\n";
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: www.example.com\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
?>
另外,stream_context系列的函数也是可以实现类似的功能。
示例如下:
$val) {
$data .= "--$boundary\n";
$d ata .= "Content-Disposition: form-data; name=\"".$key."\"\n\n".$val."\n";
}
$data .= "--$boundary\n";
//Collect Filedata
foreach($files as $key => $file)
{
$fileContents = file_get_contents($file['tmp_name']);
$data .= "Content-Disposition: form-data; name=\"{$key}\"; filename=\"{$file['name']}\"\n";
$data .= "Content-Type: image/jpeg\n";
$data .= "Content-Transfer-Encoding: binary\n\n";
$data .= $fileContents."\n";
$data .= "--$boundary--\n";
}
$params = array('http' => array(
'method' => 'POST',
'header' => 'Content-Type: multipart/form-data; boundary='.$boundary,
'content' => $data
));
$ctx = stream_context_create($params);
$fp = fopen($url, 'rb', false, $ctx);
if (!$fp) {
throw new Exception("Problem with $url, $php_errormsg");
}
$response = @stream_get_contents($fp);
if ($response === false) {
throw new Exception("Problem reading data from $url, $php_errormsg");
}
return $response;
}
$postdata = array(
'name' => $_POST['name'],
'age' => $_POST['age'],
'sex' => $_POST['sex']
);
$files['image'] = $_FILES['image'];
do_post_request("http://www.jb51.net", $postdata, $files);
?>