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?

Chilion
źródło
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", ....
AI Snoek
źródło
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"...'
}
Mohammed Safeer
źródło
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?

Bram
źródło
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();
    }
mujuonly
źródło
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.

Syclone
źródło
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 :)

JuanDMeGon
źródło
1

Możesz użyć Httpful:

Strona internetowa: http://phphttpclient.com/

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

Jeremie Ges
źródło
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