执行从Laravel到外部API的HTTP请求

我想要的是通过HTTP(例如,jQuery的Ajax)请求从API获取一个对象到外部API.我该怎么开始?我研究了谷歌先生,但我找不到任何有用的东西。

我开始怀疑这是否可能? 在这篇文章中,Laravel 4使用数据从控制器向外部URL发出POST请求,看起来是可以做到的。但是没有例子,也没有任何来源可以找到一些文档。

请帮帮我。

360064 次浏览

您只想调用外部URL并使用结果?如果我们讨论的是对服务于JSON的东西的一个简单的GET请求,那么PHP可以开箱即用:

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

如果你想做一个POST请求,这有点困难,但有很多例子可以用cURL来做。

所以我想问题是。你到底想要什么?

您可以使用httpful:

网址:http://phphttpclient.com/

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

基于对类似问题的回答: 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中使用包Guzzle,它是一个发送HTTP请求的PHP HTTP客户端。

您可以通过Composer安装Guzzle

composer require guzzlehttp/guzzle:~6.0

或者,您可以在项目的现有composer.JSON中将guzzle指定为依赖项。

{
"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"...'
}

2019年3月21日更新

使用composer require guzzlehttp/guzzle:~6.3.3添加GuzzleHttp

或者,您可以在项目的composer.json中将guzzle指定为依赖项

{
"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项目,您可能希望使用GuzzleHTTP来发送请求。 Guzzle有非常好的文档,您可以查看在这里。 我只想说,您可能希望在Laravel项目的任何组件(例如特征)中集中使用Guzzle的客户端类,而不是在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的其他内容,请查看此文章。此外,如果对此主题感兴趣或需要主要帮助,您可以参加我的课程,它将在整个过程中为您提供指导。

希望对大家有所帮助。

最好的祝愿:)

Laravel V7.X开始,该框架现在附带了包装在狂饮HTTP客户端周围的最小API.它提供了一种使用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

这无疑是现在在Laravel中进行外部API调用的最简单的方法。

Laravel 8的基本解决方案是

use Illuminate\Support\Facades\Http;


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

我在";guzzlehttp发送请求";之间发生了冲突和";照明\HTTP\请求;";别问我为什么……[它在这里可供搜索]

所以寻找我在Laravel 8 Doc中找到的1秒。

**狂饮在Laravel 8 HTTP请求中!**

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

如你所见。

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

Laravel围绕狂饮HTTP提供了一个富有表现力的最小API 客户端,允许您快速发出HTTP请求到 与其他Web应用程序通信。Laravel的包装纸 Guzzle专注于其最常见的用例和精彩的 开发人员体验.

这对我来说很好,玩得开心,如果有帮助的话,就指出来!

我还创建了类似于@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);
       

}
}

下面是对Laravel9.4的简单调用

Route::get('/currency', function () {
$response = Http::withHeaders([
'x-api-key' => 'prtl6749387986743898559646983194',
])->get('https://partners.api.skyscanner.net/apiservices/v3/culture/currencies');
return response()->json(['status'=> true,'data'=> json_decode($response->body()), 'Message'=>"Currency retrieved successfully"], 200);
});

别忘了导入

use Illuminate\Support\Facades\Http;