如题,PHP如何自动识别第三方Restful API的内容,自动渲染成 json、xml、html、serialize、csv、php等数据?
其实这也不难,因为Rest API也是基于http协议的,只要我们按照协议走,就能做到自动化识别 API 的内容,方法如下:
1、API服务端要返回明确的 http Content-Type头信息,如:
1
2
3
|
Content-Type: application/json; charset=utf-8
Content-Type: application/xml; charset=utf-8
Content-Type: text/html; charset=utf-8
|
2、PHP端(客户端)接收到上述头信息后,再酌情自动化处理,参考代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
<?php
// 请求初始化
$url = 'http://www.zzvips.com' ;
$ch = curl_init();
curl_setopt( $ch , CURLOPT_URL, $url );
curl_setopt( $ch , CURLOPT_RETURNTRANSFER, 1);
curl_setopt( $ch , CURLOPT_CONNECTTIMEOUT, 30);
// 返回的 http body 内容
$response = curl_exec( $ch );
// 返回的 http header 的 Content-Type 的内容
$contentType = curl_getinfo( $ch , 'content_type' );
// 关闭请求资源
curl_close( $ch );
// 结果自动格式输出
$autoDetectFormats = array (
'application/xml' => 'xml' ,
'text/xml' => 'xml' ,
'application/json' => 'json' ,
'text/json' => 'json' ,
'text/csv' => 'csv' ,
'application/csv' => 'csv' ,
'application/vnd.php.serialized' => 'serialize'
);
if ( strpos ( $contentType , ';' ))
{
list( $contentType ) = explode ( ';' , $contentType );
}
$contentType = trim( $contentType );
if ( array_key_exists ( $contentType , $autoDetectFormats ))
{
echo '_' . $autoDetectFormats [ $contentType ]( $response );
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 常用 格式化 方法
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++
/**
* 格式化xml输出
*/
function _xml( $string )
{
return $string ? ( array )simplexml_load_string( $string , 'SimpleXMLElement' , LIBXML_NOCDATA) : array ();
}
/**
* 格式化csv输出
*/
function _csv( $string )
{
$data = array ();
$rows = explode ( "\n" , trim( $string ));
$headings = explode ( ',' , array_shift ( $rows ));
foreach ( $rows as $row )
{
// 利用 substr 去掉 开始 与 结尾 的 "
$data_fields = explode ( '","' , trim( substr ( $row , 1, -1)));
if ( count ( $data_fields ) === count ( $headings ))
{
$data [] = array_combine ( $headings , $data_fields );
}
}
return $data ;
}
/**
* 格式化json输出
*/
function _json( $string )
{
return json_decode(trim( $string ), true);
}
/**
* 反序列化输出
*/
function _serialize( $string )
{
return unserialize(trim( $string ));
}
/**
* 执行PHP脚本输出
*/
function _php( $string )
{
$string = trim( $string );
$populated = array ();
eval ( "\$populated = \"$string\";" );
return $populated ;
}
|