web-dev-qa-db-ja.com

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

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

私は不思議に思うようになりましたこれも可能ですか?この記事では Laravel 4はデータからコントローラから外部URLへの投稿要求を行っています それは可能なようです。しかし、ドキュメントを見つけるための場所や例はありません。

私を助けてください?

122
Chilion

ここで同様の質問の答えに基づいて: 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", ....
157
AI Snoek

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"...'
}
79
Mohammed Safeer

外部URLを呼び出して結果を使用したいだけですか。 JSONにサービスを提供する単純なGETリクエストについて話しているのであれば、PHPはそのままでこれを行います。

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

投稿要求をしたいのであれば、それは少し難しいですが、curlを使ってこれを行う方法の例がたくさんあります。

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

46
Bram

2019年3月21日に更新

composer require guzzlehttp/guzzle:~6.3.3を使用してGuzzleHttpパッケージを追加する

あるいは、あなたのプロジェクトのcomposer.jsonの中で依存関係としてGuzzleを指定することもできます。

{
   "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();
    }
3
mujuonly

あなたはHttpfulを使用することができます:

ウェブサイト: http://phphttpclient.com/

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

1
Jeremie Ges

間違いなく、どのPHPプロジェクトでも、リクエストの送信にGuzzleHTTPを使用できます。 Guzzleには、確認できる非常に素晴らしいドキュメントがあります here 。言いたいのは、おそらくいくつかのコントローラーやコンポーネントでクライアントインスタンスを作成するのではなく、Laravelプロジェクトのコンポーネント(特性など)でGuzzleのクライアントクラスの使用を集中化することです。 of Laravel(多くの記事と返信が示唆するように)。

使用できるトレイトを作成しました。これにより、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に統合するには、この article をチェックしてください。さらに、このトピックに興味がある場合、または主要な支援が必要な場合は、 my course を選択して、プロセス全体をガイドできます。

皆さんのお役に立てばと思います。

ご多幸を祈る :)

0
JuanDMeGon