福哥今天带着大家给TFPHP框架添加一个非常重要的功能模块——TFHttpClient。在很多情况下,我们的控制器需要通过远程的方式调用接口上的数据或者功能,因为这些接口可能属于其他系统或者其他服务,从本地无法直接访问。
这种通过远程方式访问接口就需要借助可以模拟浏览器进行网站访问工具对象来完成,因为网站或者平台是遵循HTTP协议的,所以只要是符合HTTP协议的客户端工具都可以实现这个功能。
在PHP语言里面有个curl扩展,它实现了几乎所有HTTP协议支持的全部功能,我们通过调用这个curl扩展就可以实现通过PHP程序模拟浏览器访问远程接口的功能了。
TFHP\Socket\TFHttpClient
public static function create(TFPHP $a):TFHttpClient{
$b=new TFHttpClient($a);
return $b;
}
public function get():TFHttpClientHeader{
$a=new TFHttpClientHeader($this->a,$b);
$a->setMethod("get");
return $a;
}
public function post():TFHttpClientBody{
$a=new TFHttpClientBody($this->a,$b);
$a->setMethod("post");
return $a;
}
public function delete():TFHttpClientHeader{
$a=new TFHttpClientHeader($this->a,$b);
$a->setMethod("delete");
return $a;
}
public function put():TFHttpClientBody{
$a=new TFHttpClientBody($this->a,$b);
$a->setMethod("put");
return $a;
}
public function head():TFHttpClientHeader{
$a=new TFHttpClientHeader($this->a,$b);
$a->setMethod("head");
return $a;
}TFHP\Socket\HttpClient\TFHttpClientRequest
protected function setUri(string $a){
$this->d=$a;
}
protected function setHeaders(array $a){
$this->e=$a;
}
protected function setCookies(array $a){
$this->f=$a;
}
protected function setBody(array $a){
$this->g=$a;
}
public function setMethod(string $a){
$this->c=strtolower($a);
}
public function retrieve():TFHttpClientResponse{
$a=new TFHttpClientResponse($this->a,$this->b,$b,array($this->c,$this->d,$this->e,$this->f,$this->g,$this->h));
return $a;
}TFHP\Socket\HttpClient\TFHttpClientHeader
public function uri(string $a):TFHttpClientHeader{
$this->setUri($a);
return $this;
}
public function headers(array $a):TFHttpClientHeader{
$this->setHeaders($a);
return $this;
}
public function cookies(array $a):TFHttpClientHeader{
$this->setCookies($a);
return $this;
}TFHP\Socket\HttpClient\TFHttpClientBody
public function uri(string $a):TFHttpClientBody{
$this->setUri($a);
return $this;
}
public function headers(array $a):TFHttpClientBody{
$this->setHeaders($a);
return $this;
}
public function cookies(array $a):TFHttpClientBody{
$this->setCookies($a);
return $this;
}
public function body(array $a):TFHttpClientBody{
$this->setBody($a);
return $this;
}TFHP\Socket\HttpClient\TFHttpClientResponse
private function a(?array $a):string{
$b="";
if(is_array($a)){
foreach($a as $c=>$d){
$b.=";".$c."=".urlencode($d);
}
if($b!=""){
$b=substr($b,1);
}
}
return $b;
}
private function b(?array $a):string{
$b="";
if(is_array($a)){
foreach($a as $c=>$d){
$b.="&".$c."=".urlencode($d);
}
if($b!=""){
$b=substr($b,1);
}
}
return $b;
}
private function c(?array $a,string $b,string $c):array{
if(is_array($a)){
foreach($a as $d=>$e){
$a[strtoupper($d)]=$e;
unset($a[$d]);
}
}
if(!isset($a['EXPECT'])){
$a['EXPECT']="";
}
if(!isset($a['HOST'])){
$a['HOST']=$b;
}
if(isset($a['CONTENT-TYPE'])){
$a['CONTENT-LENGTH']=0;
if(strpos($a['CONTENT-TYPE'],"application/json")==0){
$a['X-HTTP-METHOD-OVERRIDE']=$c;
}
}
return $a;
}
private function d(?array $a):array{
$b=array();
if(is_array($a)){
foreach($a as $c=>$d){
$e=preg_replace_callback("/[a-zA-Z0-9]+/",function ($a){
$b=strtolower($a[0]);
if($b=="http"){
return"HTTP";
}
return strtoupper($b[0]).substr($b,1);
}
,$b);
$c[]=$d.": ".$e;
}
}
return $c;
}
private function e(){
$a=curl_init();
$b=$this->d[1];
$c=parse_url($b);
$d=$c['host'];
curl_setopt($a,CURLOPT_URL,$b);
curl_setopt($a,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($a,CURLOPT_MAXREDIRS,10);
curl_setopt($a,CURLOPT_RETURNTRANSFER,1);
$e=$this->d[0];
curl_setopt($a,CURLOPT_CUSTOMREQUEST,$e);
$f=$this->d[2];
$f=$this->c($f,$d,$e);
$g="";
if(strpos($f['CONTENT-TYPE'],"application/json")==0){
$g=json_encode($this->d[4]);
}
else if(strpos($f['CONTENT-TYPE'],"application/x-form-urlencoded")==0){
$g=$this->b($this->d[4]);
}
else if($f['CONTENT-TYPE']!=""){
$g=$this->d[5];
}
if($g!=""){
$f['CONTENT-LENGTH']=strlen($g);
curl_setopt($a,CURLOPT_POSTFIELDS,$g);
}
$h=$this->d($f);
curl_setopt($a,CURLINFO_HEADER_OUT,1);
curl_setopt($a,CURLOPT_HEADER,1);
curl_setopt($a,CURLOPT_HTTPHEADER,$h);
$i=$this->d[3];
$j=$this->a($i);
if($j!=""){
curl_setopt($a,CURLOPT_COOKIE,$j);
}
$k=curl_exec($a);
$l=curl_getinfo($a,CURLINFO_HEADER_OUT);
$m="";
$n=strpos($k,"\r\n\r\n");
if($n!==false){
$m=substr($k,0,$n+4);
$k=substr($k,$n+4);
}
$o=curl_error($a);
curl_close($a);
$this->e=$k;
$this->f=$o;
var_dump($k);
var_dump($l);
var_dump($m);
var_dump($o);
}
public function getResponse():?string{
return $this->e;
}
public function getResponseJson():array{
return array();
}
public function getLastError():?string{
return $this->f;
}这个是一个静态方法,用来创建一个TFHttpClient对象的实例
通过get方法启动一个实现模拟GET请求的实例
通过post方法启动一个实现模拟POST请求的实例
通过put方法启动一个实现模拟PUT请求的实例,通常情况下RESTFul规范下会有这种方式
通过delete方法启动一个实现模拟PUT请求的实例,通常情况下RESTFul规范下会有这种方式
通过head方法启动一个实现模拟PUT请求的实例
设置请求的URI地址,可以包含QUERY_STRING部分
设置请求的HTTP头信息,必须数组格式
设置请求的COOKIE信息,必须数组格式
设置请求的数据,只有POST或者PUT方式才有这个功能
一般情况下不需要自己调用
根据请求参数提交一个HTTP的访问请求,并获取远程服务器执行结果
调用父类setUri
调用父类setHeaders
调用父类setCookies
调用父类setUri
调用父类setHeaders
调用父类setCookies
调用父类setBody
组织COOKIE参数
组织请求数据
组织请求头信息
创建完整的HTTP请求头
请求服务器资源,获取服务器响应数据
获取服务器响应数据
尝试以JSON格式解析服务器响应数据
获取最后一次请求的错误信息


福哥今天带着童鞋们给TFPHP框架添加了TFHttpClient模块,有了这个HTTP客户端工具对象我们就可以在程序里面模拟浏览器访问远程服务器的页面或者接口了。
在大型的网站平台里,功能调用都是采用的这种远程接口调用的方式实现了,这种方式有一种专用的称呼叫做——RPC(Remote Process Call),使用RPC替代传统的包引用的方式在不同模块之间进行功能的调用可以大大的降低程序代码由于业务逻辑过度复杂而导致的异常情况的发生。
好了,福哥今后会不断地给我们的TFPHP框架添砖加瓦,让她越来越完美!