我们的客户给了我一个REST API,我需要对其进行PHP调用。但事实上,API所提供的文档非常有限,所以我真的不知道如何调用该服务。出现的是已经过期的Yahoo!有关如何调用服务的教程。没有提及标题或任何深度信息。

是否有关于如何调用REST API的适当信息,或有关它的一些文档?因为即使在W3schools上,它们也仅描述SOAP方法。在PHP中制作rest API有哪些不同的选择?

#1 楼

您可以使用PHP cURL扩展名访问任何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;
}


评论


@Michiel:HTTP请求方法(GET,POST,PUT等)。根据API,需要不同的方法。即GET用于阅读,POST用于写作。

–克里斯托夫·温克勒(Christoph Winkler)
2012年3月22日在7:17

@Michiel $ data是一个关联数组(data [fieldname] =值),其中包含发送到api方法的数据。

–克里斯托夫·温克勒(Christoph Winkler)
2012年3月22日在9:12

感谢您的大力协助!

– Michiel
2012年3月23日上午10:36

请注意,未调用curl_close函数,如果重复调用CallAPI函数,可能会导致额外的内存消耗。

–巴特·韦尔科延(Bart Verkoeijen)
2014年7月22日在8:19



下面来自@colan的答案是更好的方法-通过构建自己的错误处理和包装方法,可以节省您的麻烦。

–安德烈亚斯(Andreas)
16年11月10日在11:08

#2 楼

如果您有一个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);


http://sg2.php .net / manual / en / simplexml.examples-basic.php

评论


如果REST端点返回HTTP错误状态(例如401),则file_get_contents函数失败并显示警告,并返回null。如果正文包含错误消息,则无法检索它。

–巴特·韦尔科延(Bart Verkoeijen)
2014年7月22日在8:08

它的主要缺点是您的PHP安装必须启用fopen包装器才能访问URL。如果未启用fopen包装器,则将无法对Web服务请求使用file_get_contents。

– Oriol
15年2月16日在1:41

fopen包装器是现在被视为漏洞的PHP组件之一,因此您很可能会看到某些主机将其禁用。

–马库斯·唐宁(Marcus Downing)
18 Mar 29 '18在9:22

#3 楼

使用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的人从未仔细查看过此选项。

–约书亚戴维
2015年9月4日在16:57

看起来很好。但是如何获取PNG?用于地图图块。我只能在您链接的网页上找到提到的JSON数据。

–亨里克·埃兰森(Henrik Erlandsson)
18-10-11在12:33

#4 楼

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);


#5 楼

使用HTTPFUL

Httpful是一个简单的,可链接的,可读的PHP库,旨在使讲HTTP更加明智。它使开发人员可以专注于与API交互,而不是在curl set_opt页面中进行筛选,并且是理想的PHP REST客户端。

Httpful包含...


可读的HTTP方法支持(GET,PUT,POST,DELETE,HEAD和OPTIONS)
自定义标题
自动“智能”解析
自动有效负载序列化
基本身份验证
客户端证书身份验证
请求“模板”

示例。

发送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";


评论


我正在尝试使用HTTPFUL作为解决方案,我不确定它是否可以解析json,例如$ condition = $ response-> weather [0]-> main;。除非我只是在做PHP方面的错误

–weteamsteve
20年1月14日,1:16

#6 楼

您将需要知道您正在调用的REST API是否支持GETPOST或同时支持这两种方法。下面的代码对我来说很有效,我在调用自己的Web服务API,因此我已经知道API需要什么以及它将返回什么。它支持GETPOST方法,因此不太敏感的信息进入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方法更快,更可靠。

#7 楼

实际上有很多客户。害虫就是其中之一-请检查一下。并且请记住,这些REST调用是具有各种方法的简单HTTP请求:GET,POST,PUT和DELETE。

#8 楼

除了功能名称建议的file_get_contents方法之外,您还可以使用POST/PUT/DELETE/OPTIONS/HEAD发出任何http GET方法。

如何使用file_get_contents在PHP中发布数据?

评论


对于API来说,file_get_content确实是个坏主意。 stackoverflow.com/questions/13004805/…您可以设置自定义方法,例如file_get_contents_curl,并使用它代替普通的phpsolution.stackoverflow.com/questions/8540800/…

– ErykWróbel
20 Jan 30'14:43

#9 楼

如果您使用的是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方法。

#10 楼

正如@Christoph Winkler提到的,这是实现该目标的基类:

curl_helper.php

使用它,例如:any.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;
}

}


#11 楼

如果您愿意使用第三方工具,请查看以下工具:
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();


#12 楼

您可以使用POSTMAN,该应用程序使API变得容易。
填写请求字段,然后它将为您生成不同语言的代码。
只需单击右侧的代码,然后选择您喜欢的语言即可。