私が欲しいのは、外部APIへのHTTP(jQueryのAJAXなど)リクエストでAPIからオブジェクトを取得することです。どうやって始めるの?Google氏について調査しましたが、何の助けにもなりません。
これは可能ですか?この投稿では、Laravel 4は、コントローラーから外部URLへの投稿リクエストを行い、実行できるように見えます。しかし、いくつかのドキュメントを見つけるための例や情報源はありません。
私を助けてください?
私が欲しいのは、外部APIへのHTTP(jQueryのAJAXなど)リクエストでAPIからオブジェクトを取得することです。どうやって始めるの?Google氏について調査しましたが、何の助けにもなりません。
これは可能ですか?この投稿では、Laravel 4は、コントローラーから外部URLへの投稿リクエストを行い、実行できるように見えます。しかし、いくつかのドキュメントを見つけるための例や情報源はありません。
私を助けてください?
回答:
ここで同様の質問の回答に基づく:https : //stackoverflow.com/a/22695523/1412268
$client = new GuzzleHttp\Client();
$res = $client->get('https://api.github.com/user', ['auth' => ['user', 'pass']]);
echo $res->getStatusCode(); // 200
echo $res->getBody(); // { "type": "User", ....
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"...'
}
// "200"
ある// 200
ため、コメントを入力してください。
外部URLを呼び出して結果を使用したいだけですか?PHPは、JSONを提供するものへの単純なGETリクエストについて話している場合、そのまま使用できます。
$json = json_decode(file_get_contents('http://host.com/api/stuff/1'), true);
投稿リクエストを行う場合は少し難しいですが、curlでこれを行う方法の例がたくさんあります。
だから私は問題だと思います; 正確に何が欲しいですか?
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();
}
とおりLaravel v7.xより、フレームワークは、今に巻き付け、最小限のAPIが付属していますがつがつ食うHTTPクライアント。これは、HTTPクライアントを使用してget、post、put、patch、および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呼び出しを行う最も簡単な方法です。
間違いなく、どの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にこの特性を統合するための他のいくつかの詳細については、こちらの記事をご覧ください。さらに、このトピックに興味がある場合、または大きな支援が必要な場合は、プロセス全体をガイドする私のコースを受講できます。
皆さんのお役に立てば幸いです。
ご多幸を祈る :)