从Laravel向外部API执行HTTP请求


157

我想要的是从具有HTTP(例如jQuery的AJAX)请求的API到外部api的对象。我该如何开始?我曾对Google先生进行过研究,但找不到任何帮助。

我开始怀疑这是否可能?在这篇文章中,Laravel 4发出了从控制器到外部url的发布请求,其中包含看起来可以完成的数据。但是没有示例,也没有任何来源可以找到一些文档。

请帮帮我吗?


9
很久以后,创建了一个非常小的tut如何使用Guzzle。来自aisnoek的回答。chilion.nl/laravel-post-requests-with-guzzle
基连

如果仍然有兴趣,您也可以使用Curl,我想您可能会说curl是某种形式的PHP jQuery ajax。
killstreet

Answers:


195

基于此处类似问题的答案:https : //stackoverflow.com/a/22695523/1412268

看看Guzzle

$client = new GuzzleHttp\Client();
$res = $client->get('https://api.github.com/user', ['auth' =>  ['user', 'pass']]);
echo $res->getStatusCode(); // 200
echo $res->getBody(); // { "type": "User", ....

2
另请参阅Jeremie Ges的答案,看起来不错,尽管它实际上并不能回答有关Laravel的问题,但我一定会调查一下。谢谢!
Chilion 2015年

3
@ Chilion,Al Snoek引导您使用Laravel官方软件包。它已预先安装在laravel供应商组中。
parker_codes

我正在获取一个Stream对象而不是json字符串。有人能帮我吗?
Renan Coelho

我在做同样的事情,但浏览器无限旋转
Amirouche Zeggagh,

现在,Laravel 7.x中有一种更简单的方法:stackoverflow.com/a/60908329/2341298
Syclone

95

我们可以在Laravel中使用软件包Guzzle,它是一个PHP HTTP客户端,用于发送HTTP请求。

您可以通过作曲家安装Guzzle

composer require guzzlehttp/guzzle:~6.0

或者,您可以在项目的现有composer.json中将Guzzle指定为依赖项

{
   "require": {
      "guzzlehttp/guzzle": "~6.0"
   }
}

laravel 5中使用Guzzle的示例代码如下所示,

use GuzzleHttp\Client;
class yourController extends Controller {

    public function saveApiData()
    {
        $client = new Client();
        $res = $client->request('POST', 'https://url_to_the_api', [
            'form_params' => [
                'client_id' => 'test_id',
                'secret' => 'test_secret',
            ]
        ]);
        echo $res->getStatusCode();
        // 200
        echo $res->getHeader('content-type');
        // 'application/json; charset=utf8'
        echo $res->getBody();
        // {"type":"User"...'
}

2
谢谢您的回答。另请参阅我的帖子下方的评论;很久以后,创建了一个非常小的tut如何使用Guzzle。来自aisnoek的回答。chilion.nl/laravel-post-requests-with-guzzle -基连8月19日在12:09√
基连

1
您的评论// "200"应该是// 200因为返回的值是整数。
机械的

57

您只想调用一个外部URL并使用结果?如果我们正在谈论对提供JSON的对象的简单GET请求,则PHP即开即用。

$json = json_decode(file_get_contents('http://host.com/api/stuff/1'), true);

如果您要进行发布请求,这会有些困难,但是有大量示例说明如何使用curl进行此操作。

所以我想问题是;你到底想要什么?


我希望能够使用REST API的各种功能。是的,我需要POST。我以为(希望...)Laravel有一些方法可以用Laravel的方式来做,但是那时候我会坚持使用PHP。谢谢。
Chilion 2014年

如果不需要结果,只需尝试命中API或PING URL,这是最好的方法。谢谢:)
拉菲克·法哈德

7

于2019年3月21日更新

GuzzleHttp使用添加套件composer require guzzlehttp/guzzle:~6.3.3

或者,您可以将Guzzle指定为项目的依赖项 composer.json

{
   "require": {
      "guzzlehttp/guzzle": "~6.3.3"
   }
}

在要调用API的类的顶部包含以下行

use GuzzleHttp\Client;

添加以下代码以发出请求

$client = new Client();

    $res = $client->request('POST', 'http://www.exmple.com/mydetails', [
        'form_params' => [
            'name' => 'george',
        ]
    ]);

    if ($res->getStatusCode() == 200) { // 200 OK
        $response_data = $res->getBody()->getContents();
    }

7

Laravel v7.X开始,该框架现在带有围绕Guzzle HTTP客户端的最小API 。它提供了一种使用HTTP客户端进行getpostputpatchdelete请求的简单方法:

use Illuminate\Support\Facades\Http;

$response = Http::get('http://test.com');
$response = Http::post('http://test.com');
$response = Http::put('http://test.com');
$response = Http::patch('http://test.com');
$response = Http::delete('http://test.com');

您可以使用Illuminate\Http\Client\Response返回的实例提供的一组方法来管理响应。

$response->body() : string;
$response->json() : array;
$response->status() : int;
$response->ok() : bool;
$response->successful() : bool;
$response->serverError() : bool;
$response->clientError() : bool;
$response->header($header) : string;
$response->headers() : array;

请注意,您当然需要像这样安装Guzzle:

composer require guzzlehttp/guzzle

内置了许多有用的功能,您可以在此处找到有关这些功能的更多信息:https : //laravel.com/docs/7.x/http-client

现在,这绝对是在Laravel中进行外部API调用的最简单方法。


5

明确地,对于任何PHP项目,您可能希望使用GuzzleHTTP来发送请求。Guzzle有非常好的文档,您可以在这里查看。我只想说,您可能想在Laravel项目的任何组件(例如特征)中集中使用Guzzle的Client类,而不是在Laravel的多个控制器和组件上创建Client实例(与许多文章一样)并回复建议)。

我创建了一个您可以尝试使用的特征,它允许您从Laravel项目的任何组件发送请求,只需使用它并调用即可makeRequest

namespace App\Traits;
use GuzzleHttp\Client;
trait ConsumesExternalServices
{
    /**
     * Send a request to any service
     * @return string
     */
    public function makeRequest($method, $requestUrl, $queryParams = [], $formParams = [], $headers = [], $hasFile = false)
    {
        $client = new Client([
            'base_uri' => $this->baseUri,
        ]);

        $bodyType = 'form_params';

        if ($hasFile) {
            $bodyType = 'multipart';
            $multipart = [];

            foreach ($formParams as $name => $contents) {
                $multipart[] = [
                    'name' => $name,
                    'contents' => $contents
                ];
            }
        }

        $response = $client->request($method, $requestUrl, [
            'query' => $queryParams,
            $bodyType => $hasFile ? $multipart : $formParams,
            'headers' => $headers,
        ]);

        $response = $response->getBody()->getContents();

        return $response;
    }
}

请注意,此特征甚至可以处理文件发送。

如果您想要有关此特征的更多详细信息以及将该特征集成到Laravel的其他一些东西,请查看本文。此外,如果您对此主题感兴趣或需要重大帮助,您可以参加我的课程,它在整个过程中为您提供指导。

希望对大家有帮助。

最好的祝愿 :)


1

您可以使用Httpful:

网址:http : //phphttpclient.com/

GitHub:https : //github.com/nategood/httpful


看起来不错,尽管它实际上并不能回答我关于Laravel的问题,但我一定会调查一下。谢谢!
Chilion 2014年

1
Laravel还没有开箱即用,但是Laravel在composer下运行,因此您可以使用Httpful之类的库来完成工作。顺便说一句,你也可以使用requests.ryanmccue.info
雷米格斯

Laravel在作曲家的指导下,所以任何软件包都是公平的游戏。
克拉托斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.