执行HTTP请求从Laravel到外部API

Chi*_*ion 140 php http request laravel

我想要的是从API获取一个带有HTTP(例如,jQuery的AJAX)请求的对象到外部api.我该如何开始?我对谷歌先生进行了研究,但我找不到任何帮助.

我开始怀疑这是否可能?在这篇文章中,Laravel 4从控制器向外部URL发出请求数据,看起来它可以完成.但是没有任何示例或任何来源可以找到一些文档.

请帮帮我?

小智 177

基于类似问题的答案: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", ....
Run Code Online (Sandbox Code Playgroud)

  • 另请参阅Jeremie Ges的答案,看起来不错,尽管它实际上并不能回答有关Laravel的问题,但我一定会调查一下。谢谢! (2认同)
  • @ Chilion,Al Snoek引导您使用Laravel官方包装。它已预先安装在laravel供应商组中。 (2认同)
  • 我得到一个 Stream 对象而不是 json 字符串。有人能帮我吗? (2认同)

Moh*_*eer 88

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

你可以通过作曲家安装Guzzle

composer require guzzlehttp/guzzle:~6.0
Run Code Online (Sandbox Code Playgroud)

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

{
   "require": {
      "guzzlehttp/guzzle": "~6.0"
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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"...'
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢您的回答.另见我的帖子下面的评论; 很久以后,创造了一个非常小的啧啧如何使用Guzzle.从aisnoek他的回答.chilion.nl/laravel-post-requests-with-guzzle - Chilion 8月19日12:09√ (2认同)

Bra*_*ram 52

您只想调用外部URL并使用结果?如果我们正在讨论对服务JSON的东西的简单GET请求,那么PHP就是开箱即用的:

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

如果你想做一个帖子请求,那就有点难了,但是有很多例子如何用curl做这个.

所以我想这个问题是; 你究竟想要什么?


Syc*_*one 28

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');
Run Code Online (Sandbox Code Playgroud)

您可以使用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;
Run Code Online (Sandbox Code Playgroud)

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

composer require guzzlehttp/guzzle
Run Code Online (Sandbox Code Playgroud)

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

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


muj*_*nly 9

2019 年 3 月 21 日更新

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

或者您可以在项目的依赖项中指定 Guzzle composer.json

{
   "require": {
      "guzzlehttp/guzzle": "~6.3.3"
   }
}
Run Code Online (Sandbox Code Playgroud)

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

use GuzzleHttp\Client;
Run Code Online (Sandbox Code Playgroud)

添加以下代码以发出请求

$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();
}
Run Code Online (Sandbox Code Playgroud)


Jua*_*Gon 5

毫无疑问,对于任何 PHP 项目,您可能希望使用 GuzzleHTTP 发送请求。Guzzle 有非常好的文档,您可以在此处查看。我只想说,您可能希望在 Laravel 项目的任何组件(例如 trait)中集中使用 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

如果您想了解有关此 trait 的更多详细信息以及其他一些将此 trait 集成到 Laravel 的内容,请查看这篇文章。此外,如果对此主题感兴趣或需要重大帮助,您可以参加我的课程,该课程将指导您完成整个过程。

我希望它对你们所有人都有帮助。

最好的祝愿 :)