接口调用开发的底层代码

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

 在这篇文章中仅限于描述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); 
?>


转载于:https://my.oschina.net/u/2333943/blog/537267

你可能感兴趣的:(接口调用开发的底层代码)