Выполнение HTTP-запросов FROM Laravel во внешний API
Я хочу получить объект из API с запросом HTTP (например, jQuery AJAX) на внешний api. Как начать? Я исследовал г-на Google, но я не могу найти ничего полезного.
Мне кажется, что это возможно?
В этом сообщении Laravel 4 делает запрос от контроллера к внешнему URL с данными, похоже, что это можно сделать. Но нет ни одного примера, ни источника, где можно найти какую-либо документацию.
Пожалуйста, помогите мне?
Ответы
Ответ 1
Основываясь на ответе на подобный вопрос здесь:
fooobar.com/questions/75674/...
Взгляните на 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
Мы можем использовать пакет 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"...'
}
Ответ 3
Вы просто хотите вызвать внешний URL-адрес и использовать результаты? PHP делает это из коробки, если мы говорим о простом запросе GET для чего-то, обслуживающего JSON:
$json = json_decode(file_get_contents('http://host.com/api/stuff/1'), true);
Если вы хотите сделать почтовый запрос, это немного сложнее, но есть множество примеров, как сделать это с помощью curl.
Итак, я думаю, что вопрос: что именно вы хотите?
Ответ 4
Если вам просто нужно запустить запрос на внешний API, вы можете использовать класс Laravel Request следующим образом (предположим, что вы используете запрос GET)
$request = Request::create('http://your-api.com', 'GET');
Но если вам нужно получить содержание ответа, вы можете использовать Laracurl пакет следующим образом:
$response = Laracurl::get('http://your-api.com');
Ответ 5
Обновлено 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();
}
Ответ 6
Вы можете использовать Httpful:
Веб-сайт: http://phphttpclient.com/
Github: https://github.com/nategood/httpful
Ответ 7
Вы можете делать запросы с использованием Laravel и без внешних пакетов
$request = \Illuminate\Http\Request::create('http://your-api.com', 'POST', ['param1' => 'value1', 'param2' => 'value2']);
Функция запроса предоставляется, поскольку Laravel использует пакет запроса Symfony.
Ответ 8
Определенно, для любого PHP-проекта вы можете использовать GuzzleHTTP для отправки запросов.
У Guzzle есть очень хорошая документация, которую вы можете проверить здесь.
Я просто хочу сказать, что вы, вероятно, хотите централизовать использование клиентского класса Guzzle в любом компоненте вашего проекта Laravel (например, в признаке) вместо создания экземпляров Client на нескольких контроллерах и компонентах 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, проверьте эту статью. Кроме того, если вы заинтересованы в этой теме или вам нужна серьезная помощь, вы можете пройти мой курс, который проведет вас через весь процесс.
Надеюсь, это поможет всем вам.
С наилучшими пожеланиями :)