Wykonywanie żądań HTTP z Laravel do zewnętrznego API


157

Chcę uzyskać obiekt z interfejsu API z żądaniem HTTP (np. AJAX jQuery) do zewnętrznego interfejsu API. Jak mam zacząć? Poszukałem informacji o Mr Google, ale nie mogę znaleźć nic, co mogłoby mi pomóc.

Zaczynam się zastanawiać, czy to jest w ogóle możliwe? W tym poście Laravel 4 wysyła żądanie z kontrolera do zewnętrznego adresu URL z danymi , wygląda na to, że można to zrobić. Ale nie ma przykładu ani źródła, gdzie można znaleźć jakąś dokumentację.

Proszę pomóż mi?


9
Długo później stworzyłem naprawdę mały poradnik, jak używać Guzzle. Od aisnoek jego odpowiedź. chilion.nl/laravel-post-requests-with-guzzle
— Chilion

Jeśli nadal jesteś zainteresowany, możesz również użyć do tego Curl, myślę, że możesz powiedzieć, że curl to jquery ajax dla PHP w jakiejś formie.
— killstreet

Odpowiedzi:


195

Na podstawie odpowiedzi na podobne pytanie tutaj: https://stackoverflow.com/a/22695523/1412268

Spójrz na 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
Zobacz także odpowiedź Jeremiego Gesa, Wygląda świetnie, chociaż w rzeczywistości nie odpowiada ona na moje pytanie o sposób Laravela, na pewno się temu przyjrzę. Dzięki!
— Chilion

3
@Chilion, Al Snoek wskazywał na oficjalny pakiet Laravel. Jest wstępnie zainstalowany w grupie dostawców laravel.
— parker_codes

otrzymuję obiekt Stream zamiast ciągu JSON. czy ktoś może mi pomóc?
— Renan Coelho,

Robię to samo, ale moja przeglądarka
— działa w

W Laravel 7.x jest teraz łatwiejszy sposób: stackoverflow.com/a/60908329/2341298
— Syclone

95

Możemy użyć pakietu Guzzle w Laravel, jest to klient HTTP HTTP do wysyłania żądań HTTP.

Możesz zainstalować Guzzle za pomocą narzędzia Composer

composer require guzzlehttp/guzzle:~6.0

Możesz też określić Guzzle jako zależność w istniejącym pliku composer.json projektu

{
   "require": {
      "guzzlehttp/guzzle": "~6.0"
   }
}

Przykładowy kod w laravel 5 przy użyciu Guzzle, jak pokazano poniżej,

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
Dziękuję za Twoją odpowiedź. Zobacz także mój komentarz pod moim postem; Długo później stworzyłem naprawdę mały poradnik, jak używać Guzzle. Od aisnoek jego odpowiedź. chilion.nl/laravel-post-requests-with-guzzle - Chilion 19 sierpnia o 12:09 √
— Chilion

1
Twój komentarz // "200"powinien być taki, // 200że zwracana wartość jest liczbą całkowitą.
— mechaniczny

57

Chcesz po prostu zadzwonić pod zewnętrzny adres URL i wykorzystać wyniki? PHP robi to po wyjęciu z pudełka, jeśli mówimy o prostym żądaniu GET do czegoś obsługującego JSON:

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

Jeśli chcesz wysłać prośbę o wpis, jest to trochę trudniejsze, ale jest mnóstwo przykładów, jak to zrobić za pomocą curl.

Więc myślę, że pytanie brzmi; czego dokładnie chcesz?


Chcę mieć możliwość korzystania z wszelkiego rodzaju funkcji REST API. Więc tak, będę potrzebować POST. Myślałem (miałem nadzieję ...), że Laravel miałby kilka metod, aby zrobić to w sposób podobny do Laravela, ale wtedy pozostanę przy PHP. Dzięki.
— Chilion,

Jeśli nie potrzebujesz wyniku, po prostu próbujesz HIT API lub pingować adres URL, jest to najlepsze podejście. Dzięki :)
— Rafik Farhad

7

Zaktualizowano 21 marca 2019 r

Dodaj GuzzleHttppakiet za pomocącomposer require guzzlehttp/guzzle:~6.3.3

Lub możesz określić Guzzle jako zależność w swoim projekcie composer.json

{
   "require": {
      "guzzlehttp/guzzle": "~6.3.3"
   }
}

Uwzględnij poniższy wiersz na górze klasy, w której wywołujesz interfejs API

use GuzzleHttp\Client;

Dodaj poniższy kod do złożenia wniosku

$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

Począwszy od Laravel v7.X , framework jest teraz wyposażony w minimalny interfejs API zawinięty wokół klienta HTTP Guzzle . Zapewnia łatwy sposób pobierania , wysyłania , umieszczania , poprawiania i usuwania żądań za pomocą klienta 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');

Możesz zarządzać odpowiedziami za pomocą zestawu metod dostarczonych przez Illuminate\Http\Client\Responsezwróconą instancję.

$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;

Pamiętaj, że będziesz oczywiście musiał zainstalować Guzzle w następujący sposób:

composer require guzzlehttp/guzzle

Jest o wiele więcej wbudowanych przydatnych funkcji i możesz dowiedzieć się więcej o tym zestawie funkcji tutaj: https://laravel.com/docs/7.x/http-client

Jest to obecnie zdecydowanie najłatwiejszy sposób wykonywania zewnętrznych wywołań API w Laravel.


5

Ostatecznie dla każdego projektu PHP możesz chcieć użyć GuzzleHTTP do wysyłania żądań. Guzzle ma bardzo dobrą dokumentację, którą możesz sprawdzić tutaj . Chcę tylko powiedzieć, że prawdopodobnie chcesz scentralizować użycie klasy Client Guzzle w dowolnym komponencie projektu Laravel (na przykład cechę) zamiast tworzyć instancje klienta na kilku kontrolerach i komponentach Laravel (tyle artykułów i odpowiedzi sugerują).

Stworzyłem cechę, której możesz spróbować użyć, która umożliwia wysyłanie żądań z dowolnego komponentu twojego projektu Laravel, po prostu używając go i dzwoniąc do 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;
    }
}

Zauważ, że ta cecha może nawet obsługiwać wysyłanie plików.

Jeśli chcesz uzyskać więcej informacji na temat tej cechy i innych rzeczy, aby zintegrować tę cechę z Laravel, przeczytaj ten artykuł . Dodatkowo, jeśli jesteś zainteresowany tym tematem lub potrzebujesz dużej pomocy, możesz wziąć udział w moim kursie, który poprowadzi Cię przez cały proces.

Mam nadzieję, że to wam wszystkim pomoże.

Wszystkiego najlepszego :)


1

Możesz użyć Httpful:

Strona internetowa: http://phphttpclient.com/

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


Wygląda świetnie, chociaż w rzeczywistości nie odpowiada na moje pytanie o sposób Laravel, na pewno się temu przyjrzę. Dzięki!
— Chilion

1
Laravel nie ma tego po wyjęciu z pudełka, ale Laravel działa pod kontrolą kompozytora, więc możesz użyć biblioteki takiej jak Httpful, aby wykonać zadanie. Przy okazji można użyć również requests.ryanmccue.info
— Jeremie Ges

Laravel jest pod kompozytorem, więc każdy pakiet jest uczciwą grą.
— kratos
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.