我想要的是通过HTTP(例如,jQuery的Ajax)请求从API获取一个对象到外部API.我该怎么开始?我研究了谷歌先生,但我找不到任何有用的东西。
我开始怀疑这是否可能? 在这篇文章中,Laravel 4使用数据从控制器向外部URL发出POST请求,看起来是可以做到的。但是没有例子,也没有任何来源可以找到一些文档。
请帮帮我。
您只想调用外部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 require guzzlehttp/guzzle:~6.3.3
GuzzleHttp
或者,您可以在项目的composer.json中将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项目,您可能希望使用GuzzleHTTP来发送请求。 Guzzle有非常好的文档,您可以查看在这里。 我只想说,您可能希望在Laravel项目的任何组件(例如特征)中集中使用Guzzle的客户端类,而不是在Laravel的多个控制器和组件上创建客户端实例(正如许多文章和回复建议的那样)。
我创建了一个您可以尝试使用的特征,它允许您从Laravel项目的任何组件发送请求,只需使用它并调用makeRequest。
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实例提供的一组方法来管理响应。
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秒。
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;