Laravelから外部APIへのHTTPリクエストの実行


157

私が欲しいのは、外部APIへのHTTP(jQueryのAJAXなど)リクエストでAPIからオブジェクトを取得することです。どうやって始めるの?Google氏について調査しましたが、何の助けにもなりません。

これは可能ですか?この投稿では、Laravel 4は、コントローラーから外部URLへの投稿リクエストを行い、実行できるように見えます。しかし、いくつかのドキュメントを見つけるための例や情報源はありません。

私を助けてください?


9
ずいぶん後に、Guzzleの使い方を本当に小さなツタンカーメンが作成しました。aisnoekから彼の答え。chilion.nl/laravel-post-requests-with-guzzle
Chilion

それでも興味がある場合は、Curlを使用することもできます。curlはなんらかの形でPHPのjquery ajaxであると言えるでしょう。
killstreet 2016

回答:


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 WASが公式のLaravelパッケージを紹介しました。laravelベンダーグループにプリインストールされています。
parker_codes

json文字列の代わりにStreamオブジェクトを取得しています。誰かが私を助けてくれますか?
Renan Coelho

私は同じことをしていますが、ブラウザは無限に回転します
Amirouche Zeggagh

Laravel 7.xにはより簡単な方法があります:stackoverflow.com/a/60908329/2341298
Syclone

95

LaravelでGuzzleパッケージを使用できます。これは、HTTPリクエストを送信するためのPHP HTTPクライアントです。

コンポーザーからGuzzleをインストールできます

composer require guzzlehttp/guzzle:~6.0

または、プロジェクトの既存のcomposer.jsonの依存関係としてGuzzleを指定できます

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

以下に示すように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"...'
}

2
お返事ありがとうございます。投稿の下のコメントも参照してください。ずいぶん後に、Guzzleの使い方を本当に小さなツタンカーメンが作成しました。aisnoekから彼の答え。chilion.nl/laravel-post-requests-with-guzzle – Chilion 8月19日12
09√– Chilion

1
戻り値は整数で// "200"ある// 200ため、コメントを入力してください。
mechanicious

57

外部URLを呼び出して結果を使用したいだけですか?PHPは、JSONを提供するものへの単純なGETリクエストについて話している場合、そのまま使用できます。

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

投稿リクエストを行う場合は少し難しいですが、curlでこれを行う方法の例がたくさんあります。

だから私は問題だと思います; 正確に何が欲しいですか?


REST APIのあらゆる機能を利用したい。はい、POSTが必要になります。私はLaravelがLaravelのような方法でそれを行ういくつかの方法を持っていると思っていました(期待していました...)が、そのときはPHPに固執します。ありがとう。
Chilion

結果が必要ない場合は、APIをヒットするか、URLをPINGするだけで、これが最善の方法です。ありがとう:)
Rafik Farhad

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より、フレームワークは、今に巻き付け、最小限のAPIが付属していますがつがつ食うHTTPクライアント。これは、HTTPクライアントを使用してgetpostputpatch、およびdeleteリクエストを行う簡単な方法を提供します

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のいくつかのコントローラーとコンポーネントでクライアントインスタンスを作成するのではなく、Laravelプロジェクトの任意のコンポーネント(たとえば、トレイト)でGuzzleの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は作曲家の下で実行されるため、Httpfulのようなlibを使用して作業を完了できます。ちなみに、requests.ryanmccue.info
Jeremie Ges

Laravelは作曲家の下にあるので、どのパッケージも公平なゲームです。
Kratos
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.