Laravel에서 외부 API로 HTTP 요청 수행


157

내가 원하는 것은 HTTP (예 : jQuery의 AJAX) 요청이있는 API에서 외부 API로 객체를 얻는 것입니다. 어떻게 시작합니까? Google에 대해 조사했지만 도움이 될만한 내용이 없습니다.

궁금해지기 시작한이조차도 가능합니까? 이 게시물에서 Laravel 4는 컨트롤러에서 외부 URL로 게시 요청을 수행하여 가능한 것처럼 보입니다. 그러나 일부 문서를 찾을 수있는 예나 소스는 없습니다.

도와주세요?


9
오래 후, Guzzle을 사용하는 방법이 정말 작은 혀를 만들었습니다. aisnoek에서 그의 대답. chilion.nl/laravel-post-requests-with-guzzle
Chilion

그래도 Curl을 사용하여 관심이 있다면 curl이 어떤 형식의 PHP 용 jquery ajax라고 말할 수 있습니다.
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은 공식 라 라벨 패키지로 안내했습니다. laravel 공급 업체 그룹에 사전 설치되어 있습니다.
parker_codes

json 문자열 대신 Stream 객체를 가져옵니다. 누군가 나를 도울 수 있습니까?
Renan Coelho

나는 똑같은 일을하지만 브라우저가 무한대로 변합니다
Amirouche Zeggagh

Laravel 7.x에는 더 쉬운 방법이 있습니다 : stackoverflow.com/a/60908329/2341298
Syclone

95

Laravel에서 패키지 Guzzle을 사용할 수 있습니다. HTTP 요청을 보내는 PHP HTTP 클라이언트입니다.

작곡가를 통해 Guzzle을 설치할 수 있습니다

composer require guzzlehttp/guzzle:~6.0

또는 프로젝트의 기존 composer.json에서 Guzzle을 종속성으로 지정할 수 있습니다.

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

아래와 같이 Guzzle을 사용하는 laravel 5의 예제 코드

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 8 월 19 일 12:09 √
Chilion

1
당신의 의견 // "200"// 200반환 된 값이 정수이기 때문에 되어야합니다 .
기계적인

57

외부 URL을 호출하고 결과를 사용하고 싶습니까? JSON을 제공하는 무언가에 대한 간단한 GET 요청에 대해 이야기하는 경우 PHP는 즉시 이것을 수행합니다.

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

게시 요청을하고 싶다면 조금 어렵지만 curl을 사용하여이를 수행하는 방법에 대한 예제가 많이 있습니다.

그래서 나는 그 질문이 있다고 생각합니다. 정확히 무엇을 원하세요?


REST API의 모든 기능을 사용할 수 있기를 원합니다. 예, POST가 필요합니다. 나는 Laravel이 Laravel과 비슷한 방식으로 그것을 할 수있는 방법이 있다고 생각했지만 (P 홉 ...) PHP를 사용합니다. 감사.
Chilion

결과를 필요로하지 않고 API를 적중 시키거나 URL을 핑 (PING)하려고 시도하는 것이 최선의 방법입니다. 감사합니다 :)
Rafik Farhad

7

2019 년 3 월 21 일에 업데이트 됨

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 클라이언트를 사용하여 get , post , put , patchdelete 요청을 쉽게 수행 할 수 있습니다 .

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에서 확인할 수 있습니다.

이것이 Laravel 내에서 외부 API 호출을 수행하는 가장 쉬운 방법입니다.


5

확실히, 모든 PHP 프로젝트의 경우 요청을 보내는 데 GuzzleHTTP를 사용할 수 있습니다. Guzzle에는 여기에서 확인할 수있는 매우 유용한 문서가 있습니다 . Laravel의 여러 컨트롤러 및 구성 요소에서 많은 인스턴스를 생성하는 대신 Laravel 프로젝트의 모든 구성 요소 (예 : 특성)에서 Guzzle의 Client 클래스 사용을 중앙 집중화하고 싶을 것입니다. 답장은 제안합니다).

사용할 수있는 특성을 만들었습니다.이를 통해 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


라 라벨에 대한 내 질문에 실제로 대답하지는 않지만 멋지게 보입니다. 감사!
Chilion

1
Laravel은 이것을 즉시 사용할 수는 없지만 Laravel은 작곡가에서 실행되므로 Httpful과 같은 lib를 사용하여 작업을 완료 할 수 있습니다. 덧붙여서 requests.ryanmccue.info
Jeremie Ges

Laravel은 작곡가 아래 있으므로 모든 패키지는 공정한 게임입니다.
kratos
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.