如题,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 ; } |