Выполнение 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.

Syclone
источник
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();
    }
mujuonly
источник
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, проверьте эту статью . Кроме того, если вы заинтересованы в этой теме или вам нужна серьезная помощь, вы можете пройти мой курс, который проведет вас через весь процесс.

Я надеюсь, что это поможет всем вам.

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

JuanDMeGon
источник
1

Вы можете использовать Httpful:

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

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

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