Выполнение HTTP-запросов ОТ Laravel к внешнему API


157

Я хочу получить объект из API с HTTP-запросом (например, JQuery AJAX) к внешнему API. Как начать? Я исследовал мистера Гугла, но не могу найти что-то полезное.

Я начинаю задаваться вопросом, это вообще возможно? В этом посте Laravel 4 отправляет пост-запрос от контроллера к внешнему URL с данными, которые выглядят так, как будто это можно сделать. Но нет ни примера, ни источника, где можно найти документацию.

Пожалуйста, помогите мне?


9
Спустя долгое время создали действительно маленький рассказ о том, как использовать Guzzle. Из айснока его ответ. chilion.nl/laravel-post-requests-with-guzzle
— Chilion

Если вы все еще заинтересованы, вы также можете использовать Curl для этого, я думаю, вы могли бы сказать, что curl - это jquery 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
Также см. Ответ Джереми Геса: «Выглядит великолепно, хотя на самом деле он не отвечает на мой вопрос о способе Laravel, я непременно посмотрю на это». Спасибо!
— Chilion

3
@Chilion, Al Snoek БЫЛ направлять вас к официальному пакету Laravel. Он предварительно установлен в группе поставщиков laravel.
— parker_codes

Я получаю объект Stream вместо строки JSON. Кто-нибудь может мне помочь?
— Ренан Коэльо

Я делаю то же самое, но мой браузер
— вращается

В 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);

Если вы хотите сделать запрос по почте, это немного сложнее, но есть множество примеров, как сделать это с помощью curl.

Так что я думаю, вопрос в том; что именно вы хотите?


Я хочу иметь возможность использовать все виды функций REST API. Так что да, мне нужно будет POST. Я думал (надеялся ...), что у Laravel будут какие-то методы, чтобы сделать это вроде Laravel, но тогда я буду придерживаться PHP. Спасибо.
— Chilion

Если вам не нужен результат, просто попробуйте HIT API или PING URL, это лучший подход. Спасибо :)
— Рафик Фархад

8

Начиная с 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.


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();
    }

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, но я обязательно в этом разбираюсь. Спасибо!
— Chilion

1
У Laravel нет этого из коробки, но Laravel работает под управлением composer, так что вы можете использовать библиотеку вроде Httpful для выполнения работы. Кстати, вы можете также использовать request.ryanmccue.info
— Джереми Гес

Laravel находится под управлением композитора, поэтому любой пакет является честной игрой.
— Кратос
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.