source

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

gigabyte 2022. 9. 16. 23:07
반응형

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

내가 원하는 것은 HTTP(jQuery의 AJAX 등) 요구를 가진 API에서 외부 API로 객체를 가져오는 것이다.어떻게 시작할까요?나는 구글씨에 대해 조사했지만 도움이 되는 것을 찾을 수 없었다.

이게 가능하긴 한 걸까?투고에서는 Laravel 4가 컨트롤러에서 외부 URL로 포스트 요청을 할 수 있을 것 같은 데이터로 되어 있습니다.그러나 문서를 찾을 수 있는 예도 출처도 없습니다.

좀 도와주시겠어요?

여기에서도 같은 질문에 대한 답변을 바탕으로 합니다.https://stackoverflow.com/a/22695523/1412268

거즐을 보세요.

$client = new GuzzleHttp\Client();
$res = $client->get('https://api.github.com/user', ['auth' =>  ['user', 'pass']]);
echo $res->getStatusCode(); // 200
echo $res->getBody(); // { "type": "User", ....

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

작곡가를 통해 거즐을 설치할 수 있습니다.

composer require guzzlehttp/guzzle:~6.0

또는 Guzzle을 프로젝트의 기존 작곡가의 종속 요소로 지정할 수 있습니다.json

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

아래 그림과 같이 Guzle을 사용한 larabel 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"...'
}

외부 URL에 전화를 걸어 결과를 사용하시겠습니까?PHP는 JSON에 대한 단순한 GET 요청에 대해 이야기하면 바로 이 작업을 수행합니다.

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

포스트 리퀘스트를 하고 싶은 경우는 조금 어렵지만, 컬링으로 하는 예도 많이 있습니다.

그래서 질문은 정확히 무엇을 원하는가입니다.

Laravel v7.X에서 프레임워크는 Guzzle HTTP 클라이언트를 둘러싼 최소한의 API를 갖추고 있습니다.HTTP 클라이언트를 사용하여 쉽게 get, post, put, patch삭제를 수행할 있습니다.

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를 호출하는 가장 쉬운 방법입니다.

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

확실히 PHP 프로젝트에서는 Guzzle을 사용할 수 있습니다.요청을 보내기 위한 HTTP.Guzzle은 여기에서 확인할 수 있는 매우 좋은 문서를 가지고 있습니다.Laravel의 여러 컨트롤러와 컴포넌트에 클라이언트인스턴스를 작성하는 것이 아니라 Laravel 프로젝트의 임의의 컴포넌트(특징 등)에서 클라이언트클래스의 Guzzle 사용을 일원화하고 싶을 것입니다(많은 기사와 회신이 시사하고 있습니다).

수 이 수 있습니다.이 Atribute를 하여 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★이 특성에서는, 그것을 사용하고, 전화하는 것만으로, 당신의 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에 통합하기 위한 기타 사항이 필요한 경우 이 문서를 참조하십시오.또한 이 주제에 관심이 있거나 중요한 도움이 필요한 경우 전체 과정을 안내하는 내 과정을 수강할 수 있습니다.

여러분 모두에게 도움이 되길 바랍니다.

행운을 빕니다:)

Larabel 8의 기본 솔루션은

use Illuminate\Support\Facades\Http;

$response = Http::get('http://example.com');

'Guzzle'과 'Guzzle' 사이에 갈등이 있었어요.HTTP 송신 요구" 및 "Illuminate\"Http\Request;" 이유를 묻지 마세요...[검색 가능]

'8' '1'

**Guzzle is inside the Laravel 8 Http Request !**

https://laravel.com/docs/8.x/http-client#making-requests

당신이 볼 수 있듯이.

https://laravel.com/docs/8.x/http-client#introduction

Larabel은 Guzzle HTTP 클라이언트에 대해 표현적이고 최소한의 API를 제공하여 다른 웹 응용 프로그램과 통신하기 위해 신속하게 발신 HTTP 요청을 작성할 수 있도록 합니다.Laravel의 Guzzle 포장지는 가장 일반적인 사용 사례와 훌륭한 개발자 경험에 초점을 맞추고 있습니다.

나한테는 아주 잘 먹혔어. 재밌게 놀다가 도움이 된다면 포인트 업!

Httpful 을 사용할 수 있습니다.

웹사이트 : http://phphttpclient.com/

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

@JuanDMeGon과 유사한 특성을 만들어 프로젝트 내 어디에서나 사용할 수 있습니다.이것 좀 봐주세요

trait ApiRequests
{
    public function get($url, $data = null)
    {
        try {
            $response = Http::get($this->base_url . $url, $data);
        } catch (\Exception $e) {
            info($e->getMessage());
            abort(503);
        }

        if ( $response->status() == 401) {
            throw new AuthenticationException();
        } else if (! $response->successful()) {
           abort(503);
        }

        return $response->json();
    }

    public function post($url, $data = [])
    {
        $token = session()->get('token');
        try {
            $response = Http::acceptJson()->withToken($token)->post($this->base_url . $url, $data);
        } catch (\Exception $e) {
            abort(503);
        }

        if ($response->status() == 401 && !request()->routeIs('login')) {
            throw new AuthenticationException();
        }

        return $response;
    }
 
}

class Controller extends BaseController
{
    protected $base_url;
 
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests, ApiRequests;

    public function __construct()
    {
        $this->base_url = env("BASE_URL","http://192.168.xxxxxxx");
        
        View::share('base_url', $this->base_url);
       
    }
}

언급URL : https://stackoverflow.com/questions/22355828/doing-http-requests-from-laravel-to-an-external-api

반응형