Выполнение HTTP-запросов FROM Laravel во внешний API

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

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

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

Ответ 1

Основываясь на ответе на подобный вопрос здесь: fooobar.com/questions/75674/...

Взгляните на 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

Мы можем использовать пакет 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"...'
}

Ответ 3

Вы просто хотите вызвать внешний URL-адрес и использовать результаты? PHP делает это из коробки, если мы говорим о простом запросе GET для чего-то, обслуживающего JSON:

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

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

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

Ответ 4

Если вам просто нужно запустить запрос на внешний API, вы можете использовать класс Laravel Request следующим образом (предположим, что вы используете запрос GET)

$request = Request::create('http://your-api.com', 'GET');

Но если вам нужно получить содержание ответа, вы можете использовать Laracurl пакет следующим образом:

$response = Laracurl::get('http://your-api.com');

Ответ 5

Обновлено 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 и без внешних пакетов

$request = \Illuminate\Http\Request::create('http://your-api.com', 'POST', ['param1' => 'value1', 'param2' => 'value2']);

Функция запроса предоставляется, поскольку Laravel использует пакет запроса Symfony.

Ответ 8

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

Надеюсь, это поможет всем вам.

С наилучшими пожеланиями :)