การทำ HTTP ร้องขอจาก Laravel ไปยัง API ภายนอก


157

สิ่งที่ฉันต้องการคือรับวัตถุจาก API ที่มีการร้องขอ HTTP (เช่น AJAX ของ jQuery) ไปยัง API ภายนอก ฉันจะเริ่มได้อย่างไร ฉันค้นคว้าเกี่ยวกับ Mr Google แต่หาอะไรไม่ได้

ฉันเริ่มสงสัยว่ามันเป็นไปได้หรือไม่ ในโพสต์นี้Laravel 4 ทำการร้องขอโพสต์จากตัวควบคุมไปยัง url ภายนอกด้วยข้อมูลที่ดูเหมือนว่าสามารถทำได้ แต่ไม่มีตัวอย่างหรือแหล่งที่มาที่จะค้นหาเอกสารบางอย่าง

กรุณาช่วยฉันออกไป?


9
เวลานานในภายหลังสร้างตุตันคาเมนขนาดเล็กจริงๆวิธีการใช้ Guzzle จาก aisnoek คำตอบของเขา chilion.nl/laravel-post-requests-with-guzzle
คิลิโอน

หากยังคงสนใจคุณสามารถใช้ 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
ดูคำตอบของ Jeremie Ges ดูดีมากแม้ว่ามันจะไม่ตอบคำถามของฉันในความเป็นจริงเกี่ยวกับวิธีการของ Laravel แต่ฉันจะตรวจสอบเรื่องนี้ ขอบคุณ!
Chilion

3
@Chilion, Al Snoek WAS กำลังนำคุณไปสู่แพ็คเกจ Laravel อย่างเป็นทางการ ติดตั้งไว้แล้วในกลุ่มผู้จัดจำหน่าย laravel
parker_codes

ฉันได้รับวัตถุ Stream แทนสตริง JSON มีคนช่วยฉันได้ไหม
Renan Coelho

ฉันทำสิ่งเดียวกัน แต่เบราว์เซอร์ของฉันเปลี่ยนไป
เรื่อย ๆ

ขณะนี้มีวิธีที่ง่ายขึ้นใน 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 จาก aisnoek คำตอบของเขา 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 kinda แต่ฉันจะติดกับ PHP แล้ว ขอบคุณ
Chilion

หากคุณไม่ต้องการผลลัพธ์เพียงลอง HIT API หรือ PING URL นี่เป็นวิธีที่ดีที่สุด ขอบคุณ :)
Rafik Farhad

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();
    }

7

ในฐานะของLaravel v7.xกรอบในขณะนี้มาพร้อมกับ API น้อยพันรอบลูกค้าล่อ HTTP มันมีวิธีที่ง่ายที่จะทำให้ได้รับ , โพสต์ , วาง , แพทช์และลบคำขอใช้ไคลเอ็นต์ 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


5

สำหรับโครงการ PHP ใด ๆ คุณอาจต้องการใช้ GuzzleHTTP เพื่อส่งคำขอ ล่อมีเอกสารที่ดีมากคุณสามารถตรวจสอบได้ที่นี่ ฉันแค่อยากจะบอกว่าคุณอาจต้องการรวมการใช้งานระดับไคลเอนต์ของ 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 ตรวจสอบนี้บทความ นอกจากนี้หากสนใจในหัวข้อนี้หรือต้องการความช่วยเหลือที่สำคัญคุณสามารถเรียนหลักสูตรของฉันซึ่งแนะนำคุณในกระบวนการทั้งหมด

ฉันหวังว่ามันจะช่วยคุณทุกคน

ด้วยความปรารถนาดี :)


1

คุณสามารถใช้ Httpful:

เว็บไซต์: http://phphttpclient.com/

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


ดูดีแม้ว่ามันจะไม่ได้ตอบคำถามของฉันในความเป็นจริงเกี่ยวกับวิธีการของ Laravel แต่ฉันจะตรวจสอบเรื่องนี้ ขอบคุณ!
Chilion

1
Laravel ไม่ได้ออกนอกกรอบนี้ แต่ Laravel ทำงานภายใต้นักแต่งเพลงเพื่อให้คุณสามารถใช้ lib เช่น Httpful เพื่อให้งานสำเร็จ โดยวิธีที่คุณสามารถใช้คำขอได้
Ryrymccue.info

Laravel อยู่ภายใต้ผู้แต่งเพลงดังนั้นแพ็คเกจใด ๆ ก็เป็นเกมที่ยุติธรรม
kratos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.