Melakukan permintaan HTTP DARI Laravel ke API eksternal

157

Yang saya inginkan adalah mendapatkan objek dari API dengan permintaan HTTP (misalnya, AJAX jQuery) ke api eksternal. Bagaimana saya memulai? Saya melakukan riset di Mr Google tetapi saya tidak dapat menemukan bantuan.

Saya mulai bertanya-tanya apakah ini mungkin? Dalam posting ini Laravel 4 membuat permintaan posting dari controller ke url eksternal dengan data yang sepertinya dapat dilakukan. Tetapi tidak ada contoh atau sumber mana pun untuk menemukan dokumentasi.

Tolong bantu saya?

Chilion
sumber
9
Lama kemudian, membuat tut sangat kecil cara menggunakan Guzzle. Dari aisnoek jawabannya. chilion.nl/laravel-post-requests-with-guzzle
Kilyon
Jika masih tertarik Anda juga dapat menggunakan Curl untuk ini, saya kira Anda bisa mengatakan curl adalah jquery ajax untuk PHP dalam beberapa bentuk.
killstreet

Jawaban:

195

Berdasarkan jawaban dari pertanyaan serupa di sini: https://stackoverflow.com/a/22695523/1412268

Lihatlah 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 Mengintai
sumber
2
Juga lihat jawaban Jeremie Ges, Kelihatannya hebat, meskipun itu tidak menjawab pertanyaan saya sebenarnya tentang cara Laravel, saya pasti akan melihat ke dalam ini. Terima kasih!
Chilion
3
@ Chilion, Al Snoek mengarahkan Anda menuju paket Laravel resmi. Ini sudah diinstal sebelumnya di grup vendor laravel.
parker_codes
Saya mendapatkan objek Stream bukannya json string. dapatkah seseorang membantu saya?
Renan Coelho
Saya melakukan hal yang sama tetapi peramban saya berubah tanpa batas
Amirouche Zeggagh
Sekarang ada cara yang lebih mudah di Laravel 7.x: stackoverflow.com/a/60908329/2341298
Syclone
95

Kita dapat menggunakan paket Guzzle di Laravel, itu adalah klien HTTP PHP untuk mengirim permintaan HTTP.

Anda dapat menginstal Guzzle melalui komposer

composer require guzzlehttp/guzzle:~6.0

Atau Anda dapat menentukan Guzzle sebagai ketergantungan pada composer.json proyek Anda yang ada

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

Contoh kode dalam laravel 5 menggunakan Guzzle seperti yang ditunjukkan di bawah ini,

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
sumber
2
Terima kasih atas jawaban Anda. Lihat juga komentar saya di bawah posting saya; Lama kemudian, membuat tut sangat kecil cara menggunakan Guzzle. Dari aisnoek jawabannya. chilion.nl/laravel-post-requests-with-guzzle - Chilion 19 Agustus 12:09 √
Chilion
1
Komentar Anda // "200"seharusnya // 200karena nilai yang dikembalikan adalah bilangan bulat.
montir
57

Anda hanya ingin memanggil URL eksternal dan menggunakan hasilnya? PHP melakukan ini di luar kebiasaan, jika kita berbicara tentang permintaan GET sederhana untuk sesuatu yang melayani JSON:

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

Jika Anda ingin melakukan permintaan posting, ini sedikit lebih sulit tetapi ada banyak contoh bagaimana melakukan ini dengan curl.

Jadi saya kira pertanyaannya adalah; apa yang sebenarnya kamu inginkan?

Bram
sumber
Saya ingin dapat menggunakan semua jenis fungsi REST API. Jadi ya, saya perlu POST. Saya pikir (berharap ...) bahwa Laravel akan memiliki beberapa metode untuk melakukannya dengan cara Laravel, tetapi saya akan tetap menggunakan PHP. Terima kasih.
Chilion
Jika Anda tidak membutuhkan hasilnya, cukup mencoba HIT API atau PING URL, ini adalah pendekatan terbaik. Terima kasih :)
Rafik Farhad
8

Pada Laravel v7.X , kerangka kerja sekarang hadir dengan API minimal yang membungkus klien HTTP Guzzle . Ini menyediakan cara mudah untuk membuat get , posting , put , Patch , dan menghapus permintaan menggunakan 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');

Anda dapat mengelola respons menggunakan serangkaian metode yang disediakan oleh Illuminate\Http\Client\Responseinstance yang dikembalikan.

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

Harap perhatikan bahwa Anda harus menginstal Guzzle seperti:

composer require guzzlehttp/guzzle

Ada banyak fitur yang lebih bermanfaat yang ada di dalamnya dan Anda dapat mengetahui lebih banyak tentang set fitur ini di sini: https://laravel.com/docs/7.x/http-client

Ini jelas sekarang cara termudah untuk melakukan panggilan API eksternal dalam Laravel.

Siklon
sumber
7

Diperbarui pada 21 Maret 2019

Tambahkan GuzzleHttppaket menggunakancomposer require guzzlehttp/guzzle:~6.3.3

Atau Anda dapat menentukan Guzzle sebagai ketergantungan pada proyek Anda composer.json

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

Sertakan baris di bawah ini di bagian atas kelas tempat Anda memanggil API

use GuzzleHttp\Client;

Tambahkan kode di bawah ini untuk mengajukan permintaan

$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
sumber
5

Secara pasti, untuk proyek PHP apa pun, Anda mungkin ingin menggunakan GuzzleHTTP untuk mengirim permintaan. Guzzle memiliki dokumentasi yang sangat bagus yang dapat Anda periksa di sini . Saya hanya ingin mengatakan itu, Anda mungkin ingin memusatkan penggunaan kelas Klien Guzzle dalam komponen apa pun dari proyek Laravel Anda (misalnya suatu sifat) alih-alih membuat mesin virtual Klien pada beberapa pengontrol dan komponen Laravel (karena banyak artikel dan balasan menyarankan).

Saya membuat sifat yang dapat Anda coba gunakan, yang memungkinkan Anda mengirim permintaan dari setiap komponen proyek Laravel Anda, cukup menggunakannya dan menelepon ke 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;
    }
}

Perhatikan sifat ini bahkan dapat menangani pengiriman file.

Jika Anda ingin detail lebih lanjut tentang sifat ini dan beberapa hal lain untuk mengintegrasikan sifat ini ke Laravel, periksa artikel ini . Selain itu, jika tertarik dengan topik ini atau membutuhkan bantuan besar, Anda dapat mengambil kursus saya yang memandu Anda dalam keseluruhan proses.

Saya harap ini membantu Anda semua.

Semoga sukses :)

JuanDMeGon
sumber
1

Anda dapat menggunakan Httpful:

Situs web: http://phphttpclient.com/

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

Jeremie Ges
sumber
Tampak hebat, meskipun tidak menjawab pertanyaan saya tentang Laravel, saya yakin akan melihat ini. Terima kasih!
Chilion
1
Laravel tidak mengeluarkan ini dari kotak, tetapi Laravel dijalankan di bawah komposer sehingga Anda dapat menggunakan lib seperti Httpful untuk menyelesaikan pekerjaan. Ngomong-ngomong, Anda dapat menggunakan juga requests.ryanmccue.info
Jeremie Ges
Laravel berada di bawah komposer sehingga paket apa pun adalah permainan yang adil.
kratos