Ausführen von HTTP-Anforderungen von Laravel an eine externe API

157

Ich möchte ein Objekt von einer API mit einer HTTP-Anforderung (z. B. AJAX von jQuery) an eine externe API abrufen. Wie fange ich an? Ich habe bei Herrn Google recherchiert, aber ich kann nichts Hilfreiches finden.

Ich fange an mich zu fragen, ob das überhaupt möglich ist. In diesem Beitrag stellt Laravel 4 eine Post-Anfrage vom Controller an eine externe URL mit Daten , wie es aussieht. Es gibt jedoch weder ein Beispiel noch eine Quelle, in der Dokumentation zu finden ist.

Bitte hilf mir?

Chilion
quelle
9
Lange Zeit später wurde ein wirklich kleines Tutorial zur Verwendung von Guzzle erstellt. Von aisnoek seine Antwort. chilion.nl/laravel-post-requests-with-guzzle
Chilion
Wenn Sie immer noch interessiert sind, können Sie auch Curl verwenden. Ich könnte sagen, dass Curl in irgendeiner Form der jquery ajax für PHP ist.
Killstreet

Antworten:

195

Basierend auf einer Antwort auf eine ähnliche Frage hier: https://stackoverflow.com/a/22695523/1412268

Schauen Sie sich Guzzle an

$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
quelle
2
Siehe auch die Antwort von Jeremie Ges: Sieht großartig aus, obwohl sie meine Frage nach einem Laravel-Weg nicht beantwortet, werde ich das auf jeden Fall untersuchen. Vielen Dank!
Chilion
3
@Chilion, Al Snoek hat Sie zu einem offiziellen Laravel-Paket geleitet. Es ist in der Gruppe der Laravel-Anbieter vorinstalliert.
parker_codes
Ich bekomme ein Stream-Objekt anstelle von JSON-String. kann mir jemand helfen?
Renan Coelho
Ich mache das gleiche, aber mein Browser dreht sich unendlich
Amirouche Zeggagh
In Laravel 7.x gibt es jetzt einen einfacheren Weg: stackoverflow.com/a/60908329/2341298
Syclone
95

Wir können das Paket Guzzle in Laravel verwenden. Es ist ein PHP-HTTP-Client zum Senden von HTTP-Anforderungen.

Sie können Guzzle über Composer installieren

composer require guzzlehttp/guzzle:~6.0

Oder Sie können Guzzle als Abhängigkeit in der vorhandenen composer.json Ihres Projekts angeben

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

Beispielcode in Laravel 5 mit Guzzle wie unten gezeigt,

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
quelle
2
Vielen Dank für Ihre Antwort. Siehe auch meinen Kommentar unter meinem Beitrag; Lange Zeit später wurde ein wirklich kleines Tutorial zur Verwendung von Guzzle erstellt. Von aisnoek seine Antwort. chilion.nl/laravel-post-requests-with-guzzle - Chilion 19. August um 12:09 √
Chilion
1
Ihr Kommentar // "200"sollte sein, // 200weil der zurückgegebene Wert eine Ganzzahl ist.
mechanicious
57

Sie möchten nur eine externe URL aufrufen und die Ergebnisse verwenden? PHP macht dies sofort, wenn es sich um eine einfache GET-Anfrage an etwas handelt, das JSON bedient:

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

Wenn Sie eine Post-Anfrage stellen möchten, ist es etwas schwieriger, aber es gibt viele Beispiele, wie Sie dies mit Curl tun können.

Ich denke also, die Frage ist: Was genau willst du?

Bram
quelle
Ich möchte in der Lage sein, alle Arten von Funktionen einer REST-API zu verwenden. Also ja, ich brauche POST. Ich dachte (hoffte ...), dass Laravel einige Methoden haben würde, um es auf eine Laravel-Art und Weise zu tun, aber ich werde mich dann an PHP halten. Vielen Dank.
Chilion
Wenn Sie das Ergebnis nicht benötigen und nur versuchen, die API zu treffen oder eine URL zu pingen, ist dies der beste Ansatz. Danke :)
Rafik Farhad
7

Aktualisiert am 21. März 2019

GuzzleHttpPaket hinzufügen mitcomposer require guzzlehttp/guzzle:~6.3.3

Oder Sie können Guzzle als Abhängigkeit in Ihrem Projekt angeben composer.json

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

Fügen Sie die folgende Zeile oben in die Klasse ein, in der Sie die API aufrufen

use GuzzleHttp\Client;

Fügen Sie den folgenden Code für die Anforderung hinzu

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

Ab Laravel v7.X enthält das Framework jetzt eine minimale API, die um den Guzzle-HTTP-Client gewickelt ist . Es bietet eine einfache Möglichkeit zu machen get , Post , put , Patch , und löschen Anfragen , die unter Verwendung von HTTP - Client :

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

Sie können Antworten mithilfe der Methoden verwalten, die von der zurückgegebenen Illuminate\Http\Client\ResponseInstanz bereitgestellt werden .

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

Bitte beachten Sie, dass Sie Guzzle natürlich wie folgt installieren müssen:

composer require guzzlehttp/guzzle

Es sind viel mehr hilfreiche Funktionen integriert, und Sie können hier mehr über diese Funktionen erfahren: https://laravel.com/docs/7.x/http-client

Dies ist definitiv jetzt der einfachste Weg, externe API-Aufrufe in Laravel durchzuführen.

Syclone
quelle
5

Auf jeden Fall möchten Sie für jedes PHP-Projekt GuzzleHTTP zum Senden von Anforderungen verwenden. Guzzle hat eine sehr schöne Dokumentation, die Sie hier überprüfen können . Ich möchte nur sagen, dass Sie wahrscheinlich die Verwendung der Client-Klasse von Guzzle in einer beliebigen Komponente Ihres Laravel-Projekts (z. B. einem Merkmal) zentralisieren möchten, anstatt Client-Instanzen auf mehreren Controllern und Komponenten von Laravel zu erstellen (ebenso viele Artikel) und Antworten vorschlagen).

Ich habe ein Merkmal erstellt, das Sie verwenden können, mit dem Sie Anforderungen von jeder Komponente Ihres Laravel-Projekts senden können, indem Sie es einfach verwenden und aufrufen 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;
    }
}

Beachten Sie, dass dieses Merkmal sogar das Senden von Dateien verarbeiten kann.

Wenn Sie weitere Details zu diesem Merkmal und einige andere Dinge wünschen, um dieses Merkmal in Laravel zu integrieren, lesen Sie diesen Artikel . Wenn Sie sich für dieses Thema interessieren oder wichtige Unterstützung benötigen, können Sie auch an meinem Kurs teilnehmen, der Sie durch den gesamten Prozess führt.

Ich hoffe es hilft euch allen.

Die besten Wünsche :)

JuanDMeGon
quelle
1

Sie können Httpful verwenden:

Website: http://phphttpclient.com/

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

Jeremie Ges
quelle
Sieht gut aus, obwohl es meine Frage nach einem Laravel-Weg nicht beantwortet, werde ich das auf jeden Fall untersuchen. Vielen Dank!
Chilion
1
Laravel hat dies nicht sofort einsatzbereit, aber Laravel läuft unter Composer, sodass Sie eine Bibliothek wie Httpful verwenden können, um die Arbeit zu erledigen. Übrigens können Sie auch request.ryanmccue.info
Jeremie Ges
Laravel ist unter Komponist, also ist jedes Paket ein faires Spiel.
kratos