Здійснення HTTP-запитів від Laravel до зовнішнього API


157

Мені потрібно отримати об'єкт від API з HTTP-запитом (наприклад, запитом AJAX jQuery) до зовнішнього api. Як почати? Я робив дослідження на містері Google, але не можу знайти нічого, що допоможе.

Я починаю цікавитись, чи це можливо навіть? У цій публікації Laravel 4 робить запит на пошту від контролера до зовнішнього URL з даними, схожими на це. Але немає ні прикладу, ні будь-якого джерела, де можна знайти якусь документацію.

Будь ласка, допоможіть мені?


9
Довгий час пізніше створили дійсно невелику туту, як користуватися Guzzle. З аїснек його відповідь. chilion.nl/laravel-post-requests-with-guzzle
Кілйон

Якщо ви все ще зацікавлені, ви також можете використовувати Curl для цього, я б припустив, що ви можете сказати, що curl - це jjack ajax для PHP в якійсь формі.
killstreet

Відповіді:


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
Також дивіться відповідь Джеремі Гес: Виглядає чудово, хоча це не відповідає моєму питанню про спосіб Ларавеля свого роду, я обов'язково вивчу це. Дякую!
Чиліон

3
@Chilion, Аль Снук ВІН спрямував вас до офіційного пакету Laravel. Він попередньо встановлений у групі постачальників laravel.
parker_codes

я отримую об'єкт Stream замість рядка json. хтось може мені допомогти?
Ренан Коельо

Я роблю те саме, але мій браузер нескінченно повертається
Amirouche Zeggagh,

Зараз у Laravel 7.x простіший шлях: stackoverflow.com/a/60908329/2341298
Syclone

95

Ми можемо використовувати пакет Guzzle в Laravel, це клієнт PHP HTTP для надсилання HTTP-запитів.

Ви можете встановити Guzzle через композитор

composer require guzzlehttp/guzzle:~6.0

Або ви можете вказати Guzzle як залежність у існуючому composer.json вашого проекту

{
   "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
Спасибі за вашу відповідь. Також дивіться мій коментар під моїм повідомленням; Довгий час пізніше створили дійсно невелику туту, як користуватися Guzzle. З аїснек його відповідь. chilion.nl/laravel-post-requests-with-guzzle - Chilion 19 серпня о 12:09 √
Chilion

1
Ваш коментар // "200"повинен бути, // 200тому що повернене значення є цілим числом.
механічний

57

Ви просто хочете зателефонувати до зовнішньої URL-адреси та використати результати? PHP робить це нестандартно, якщо ми говоримо про простий GET-запит на те, що обслуговує JSON:

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

Якщо ви хочете зробити запит на пошту, це трохи складніше, але є безліч прикладів, як це зробити з завитком.

Тому я здогадуюсь питання; чого саме ти хочеш?


Я хочу мати можливість використовувати всі види функцій API REST. Так що так, мені знадобиться POST. Я подумав (сподівався ...), що у Laravel знайдуться якісь методи, щоб зробити це на зразок Laravel свого роду, але я тоді дотримуватимуся PHP. Дякую.
Чиліон

Якщо вам не потрібен результат, просто спробуйте HIT API або PING URL, це найкращий підхід. Дякую :)
Рафік Фархад

7

Оновлено 21 березня 2019 року

Додайте 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-клієнта Guzzle . Це забезпечує легкий спосіб зробити МЕТ , посаду , покласти , патч , і на видалення запитів з допомогою HTTP - клієнта :

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

Це, безумовно, зараз найпростіший спосіб здійснювати зовнішні дзвінки API в Laravel.


5

Безперечно, для будь-якого проекту PHP ви можете використовувати GuzzleHTTP для надсилання запитів. У Guzzle є дуже приємна документація, яку ви можете перевірити тут . Я просто хочу сказати, що, ймовірно, ви хочете централізувати використання класу клієнтів Guzzle в будь-якому компоненті вашого проекту Laravel (наприклад, ознака), а не створювати клієнтські екземпляри на кількох контролерах і компонентах 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, перегляньте цю статтю . Крім того, якщо вас зацікавила ця тема або вам потрібна значна допомога, ви можете пройти мій курс, який керує вами у всьому процесі.

Я сподіваюся, що це допоможе вам усім.

Найкращі побажання :)


1

Ви можете використовувати Httpful:

Веб-сайт: http://phphttpclient.com/

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


Виглядає чудово, хоча це не відповідає на моє запитання про спосіб Laravel свого роду, я обов'язково вивчу це. Дякую!
Чиліон

1
У Laravel цього не вийшло, але Laravel працює під композитором, тож ви можете використовувати ліб, як Httpful, щоб виконати роботу. До речі , ви також можете використовувати requests.ryanmccue.info
Жеремі Ges

Laravel є композитором, тому будь-який пакет - це чесна гра.
kratos
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.