28

使用 Symfony2,我需要访问一个基于 HTTPS 的外部 API。

如何调用外部 URI 并管理响应以“播放”它。例如,呈现成功或失败消息?

我正在考虑类似的事情(注意 performRequest 是一种完全发明的方法):

$response = $this -> performRequest("www.someapi.com?param1=A&param2=B");

if ($response -> getError() == 0){
    // Do something good
}else{
    // Do something too bad
}

我一直在阅读有关 Buzz 和其他客户的信息。但我想 Symfony2 应该可以自己做。

4

6 回答 6

33

我建议使用 CURL:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'www.someapi.com?param1=A&param2=B');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/json')); // Assuming you're requesting JSON
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$response = curl_exec($ch);

// If using JSON...
$data = json_decode($response);

注意:您的 Web 服务器上的 php 必须安装该php5-curl库。

假设 API 请求返回 JSON 数据,此页面可能有用。

这不使用任何特定于 Symfony2 的代码。很可能有一个捆绑包可以为您简化此过程,但如果有我不知道。

于 2012-10-25T15:45:34.577 回答
27

Symfony 没有为此提供内置服务,但这是使用依赖注入框架创建您自己的服务的绝佳机会。您可以在这里做的是编写一个服务来管理外部调用。我们将服务称为“http”。

首先,编写一个带有performRequest()方法的类:

namespace MyBundle\Service;

class Http
{    
    public function performRequest($siteUrl)
    {
        // Code to make the external request goes here
        // ...probably using cUrl
    }
}

将其注册为服务app/config/config.yml

services:
    http:
        class: MyBundle\Service\Http

现在您的控制器可以访问名为“http”的服务。Symfony 在“容器”中管理此类的单个实例,您可以通过以下方式访问它$this->get("http")

class MyController
{
    $response = $this->get("http")->performRequest("www.something.com");

    ...
}
于 2012-10-25T16:37:52.890 回答
14

我知道的最好的客户是:http ://docs.guzzlephp.org/en/latest/

已经有将它集成到 Symfony2 项目中的包: https ://github.com/8p/GuzzleBundle

$client   = $this->get('guzzle.client');

// send an asynchronous request.
$request = $client->createRequest('GET', 'http://httpbin.org', ['future' => true]);
// callback
$client->send($request)->then(function ($response) {
    echo 'I completed! ' . $response;
});

// optional parameters
$response = $client->get('http://httpbin.org/get', [
    'headers' => ['X-Foo-Header' => 'value'],
    'query'   => ['foo' => 'bar']
]);
$code = $response->getStatusCode();
$body = $response->getBody();

// json response
$response = $client->get('http://httpbin.org/get');
$json = $response->json();

// extra methods
$response = $client->delete('http://httpbin.org/delete');
$response = $client->head('http://httpbin.org/get');
$response = $client->options('http://httpbin.org/get');
$response = $client->patch('http://httpbin.org/patch');
$response = $client->post('http://httpbin.org/post');
$response = $client->put('http://httpbin.org/put');

可以在以下位置找到更多信息:http ://docs.guzzlephp.org/en/latest/index.html

于 2015-03-22T11:18:44.397 回答
10

https://github.com/sensio/SensioBuzzBundle似乎是您正在寻找的。

它实现了 Kris Wallsmith 嗡嗡声库来执行 HTTP 请求。

我会让你阅读 github 页面上的文档,用法非常基本:

$buzz = $this->container->get('buzz');

$response = $buzz->get('http://google.com');

echo $response->getContent();
于 2012-10-25T17:57:09.190 回答
3

Symfony 没有自己的 rest 客户端,但正如您已经提到的,有几个捆绑包。这是我最喜欢的一个:

https://github.com/CircleOfNice/CiRestClientBundle

$restClient = $this->container->get('ci.restclient');

$restClient->get('http://www.someUrl.com');
$restClient->post('http://www.someUrl.com', 'somePayload');
$restClient->put('http://www.someUrl.com', 'somePayload');
$restClient->delete('http://www.someUrl.com');
$restClient->patch('http://www.someUrl.com', 'somePayload');

$restClient->head('http://www.someUrl.com');
$restClient->options('http://www.someUrl.com', 'somePayload');
$restClient->trace('http://www.someUrl.com');
$restClient->connect('http://www.someUrl.com');

您通过以下方式发送请求

$response = $restclient->get($url); 

并获得一个 Symfony 响应对象。然后您可以通过以下方式获取状态码

$httpCode = $response-> getStatusCode();

您的代码如下所示:

$restClient = $this->container->get('ci.restclient');
if ($restClient->get('http://www.yourUrl.com')->getStatusCode !== 200) {
    // no error
} else {
    // error
}
于 2015-03-22T00:03:04.007 回答
1

使用HttpClient类创建发出请求的低级 HTTP 客户端,如以下 GET 请求:

    use Symfony\Component\HttpClient\HttpClient;

$client = HttpClient::create();
$response = $client->request('GET', 'https://api.github.com/repos/symfony/symfony-docs');

$statusCode = $response->getStatusCode();
// $statusCode = 200
$contentType = $response->getHeaders()['content-type'][0];
// $contentType = 'application/json'
$content = $response->getContent();
// $content = '{"id":521583, "name":"symfony-docs", ...}'
$content = $response->toArray();
// $content = ['id' => 521583, 'name' => 'symfony-docs', ...]

这与 Symfony 5 兼容。 Symfony 有关此主题的手册:HttpClient 组件

于 2020-04-14T11:06:42.493 回答