Answers:
您可以使用PHPs cURL
Extension 访问任何REST API 。但是,API文档(方法,参数等)必须由您的客户提供!
例:
// Method: POST, PUT, GET etc
// Data: array("param" => "value") ==> index.php?param=value
function CallAPI($method, $url, $data = false)
{
$curl = curl_init();
switch ($method)
{
case "POST":
curl_setopt($curl, CURLOPT_POST, 1);
if ($data)
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
break;
case "PUT":
curl_setopt($curl, CURLOPT_PUT, 1);
break;
default:
if ($data)
$url = sprintf("%s?%s", $url, http_build_query($data));
}
// Optional Authentication:
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($curl, CURLOPT_USERPWD, "username:password");
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($curl);
curl_close($curl);
return $result;
}
$data
是一个关联数组(数据[字段名称] =值),其中保存发送到api方法的数据。
curl_close
函数未调用,如果重复调用CallAPI函数,可能会导致额外的内存消耗。
如果您有一个URL并且您的php支持它,则可以只调用file_get_contents:
$response = file_get_contents('http://example.com/path/to/api/call?param1=5');
如果$ response是JSON,请使用json_decode将其转换为php数组:
$response = json_decode($response);
如果$ response是XML,请使用simple_xml类:
$response = new SimpleXMLElement($response);
file_get_contents
函数将失败并显示警告,并返回null。如果正文包含错误消息,则无法检索它。
使用Guzzle。它是“ PHP HTTP客户端,可以轻松使用HTTP / 1.1并减轻使用Web服务的麻烦”。使用Guzzle比使用cURL容易得多。
这是网站上的一个示例:
$client = new GuzzleHttp\Client();
$res = $client->get('https://api.github.com/user', [
'auth' => ['user', 'pass']
]);
echo $res->getStatusCode(); // 200
echo $res->getHeader('content-type'); // 'application/json; charset=utf8'
echo $res->getBody(); // {"type":"User"...'
var_export($res->json()); // Outputs the JSON decoded data
CURL是最简单的方法。这是一个简单的电话
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "THE URL TO THE SERVICE");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, POST DATA);
$result = curl_exec($ch);
print_r($result);
curl_close($ch);
使用HTTPFUL
Httpful是一个简单的,可链接的,可读的PHP库,旨在使讲HTTP更加明智。它使开发人员可以专注于与API交互,而不必在curl set_opt页面中进行筛选,并且是理想的PHP REST客户端。
Httpful包括...
例如
发送GET请求。获取自动解析的JSON响应。
该库会在响应中注意到JSON Content-Type,并自动将响应解析为本地PHP对象。
$uri = "https://www.googleapis.com/freebase/v1/mqlread?query=%7B%22type%22:%22/music/artist%22%2C%22name%22:%22The%20Dead%20Weather%22%2C%22album%22:%5B%5D%7D";
$response = \Httpful\Request::get($uri)->send();
echo 'The Dead Weather has ' . count($response->body->result->album) . " albums.\n";
$condition = $response->weather[0]->main;
除非我只是在做PHP方面的错误
你需要知道,如果REST API您呼叫支持GET
或POST
,或这两种方法。下面的代码对我来说很有效,我在调用自己的Web服务API,因此我已经知道API需要什么以及它将返回什么。它同时支持GET
和POST
方法,因此不太敏感的信息进入URL (GET)
,而用户名和密码之类的信息则作为POST
变量提交。同样,一切都经过HTTPS
连接。
在API代码内部,我对要返回json格式的数组进行了编码,然后只需使用PHP命令echo $my_json_variable
将json字符串提供给客户端即可。
如您所见,我的API返回了json数据,但是您需要知道(或查看返回的数据以找出)API响应所采用的格式。
这是我从客户端连接到API的方式:
$processed = FALSE;
$ERROR_MESSAGE = '';
// ************* Call API:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.myapi.com/api.php?format=json&action=subscribe&email=" . $email_to_subscribe);
curl_setopt($ch, CURLOPT_POST, 1);// set post data to true
curl_setopt($ch, CURLOPT_POSTFIELDS,"username=myname&password=mypass"); // post data
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$json = curl_exec($ch);
curl_close ($ch);
// returned json string will look like this: {"code":1,"data":"OK"}
// "code" may contain an error code and "data" may contain error string instead of "OK"
$obj = json_decode($json);
if ($obj->{'code'} == '1')
{
$processed = TRUE;
}else{
$ERROR_MESSAGE = $obj->{'data'};
}
...
if (!$processed && $ERROR_MESSAGE != '') {
echo $ERROR_MESSAGE;
}
顺便说一句,我也尝试使用file_get_contents()
此处的一些用户建议的方法,但这对我来说不是很好。我发现该curl
方法更快,更可靠。
除了函数名称建议的方法外,您还可以使用file_get_contents
它发出任何http POST/PUT/DELETE/OPTIONS/HEAD
方法GET
。
如果您使用的是Symfony,那么还有一个很棒的客户端捆绑包,它甚至包括所有〜100个异常并抛出它们,而不是返回一些毫无意义的错误代码+消息。
您应该检查一下:https : //github.com/CircleOfNice/CiRestClientBundle
我喜欢界面:
try {
$restClient = new RestClient();
$response = $restClient->get('http://www.someUrl.com');
$statusCode = $response->getStatusCode();
$content = $response->getContent();
} catch(OperationTimedOutException $e) {
// do something
}
适用于所有http方法。
正如@Christoph Winkler提到的,这是实现它的基类:
curl_helper.php
// This class has all the necessary code for making API calls thru curl library
class CurlHelper {
// This method will perform an action/method thru HTTP/API calls
// Parameter description:
// Method= POST, PUT, GET etc
// Data= array("param" => "value") ==> index.php?param=value
public static function perform_http_request($method, $url, $data = false)
{
$curl = curl_init();
switch ($method)
{
case "POST":
curl_setopt($curl, CURLOPT_POST, 1);
if ($data)
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
break;
case "PUT":
curl_setopt($curl, CURLOPT_PUT, 1);
break;
default:
if ($data)
$url = sprintf("%s?%s", $url, http_build_query($data));
}
// Optional Authentication:
//curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
//curl_setopt($curl, CURLOPT_USERPWD, "username:password");
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($curl);
curl_close($curl);
return $result;
}
}
然后,您可以始终包含该文件并使用它,例如:any.php
require_once("curl_helper.php");
...
$action = "GET";
$url = "api.server.com/model"
echo "Trying to reach ...";
echo $url;
$parameters = array("param" => "value");
$result = CurlHelper::perform_http_request($action, $url, $parameters);
echo print_r($result)
如果您愿意使用第三方工具,请查看以下工具:https : //github.com/CircleOfNice/DoctrineRestDriver
这是使用API的全新方法。
首先,您定义一个实体,该实体定义传入和传出数据的结构,并使用数据源对其进行注释:
/*
* @Entity
* @DataSource\Select("http://www.myApi.com/products/{id}")
* @DataSource\Insert("http://www.myApi.com/products")
* @DataSource\Select("http://www.myApi.com/products/update/{id}")
* @DataSource\Fetch("http://www.myApi.com/products")
* @DataSource\Delete("http://www.myApi.com/products/delete/{id}")
*/
class Product {
private $name;
public function setName($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
}
现在,与REST API通信非常容易:
$product = new Product();
$product->setName('test');
// sends an API request POST http://www.myApi.com/products ...
$em->persist($product);
$em->flush();
$product->setName('newName');
// sends an API request UPDATE http://www.myApi.com/products/update/1 ...
$em->flush();