Laravel 8 HTTP客户端介绍
自7.x.x版本发布以来,Laravel已经有了很大的发展。其中一个关键的改进领域是围绕Guzzle HTTP客户端。这篇文章将作为Laravel 8 HTTP客户端的介绍。
要求
- PHP 7.4.x
- Laravel 8.x
- 邮递员
对Guzzle API的快速介绍
想象一下,你正在建立一个Web应用程序,你想让它与其他在线服务沟通。例如,你可能想从电影数据库中获取电影,并在你的应用程序中显示它们。你如何在PHP中实现这个目标?
嗯,你可能已经猜到了,Guzzle HTTP客户端就是上述问题的简单解决方案。Guzzle HTTP客户端允许你的应用程序进行HTTP请求。
考虑到这一点,为了从Movie Database API中获取电影,我们要做以下工作。
<?php
$client= new GuzzleHttp\Client();
$res=
$client->request('GET','https://api.themoviedb.org/3/movie/550?api_key={api_key}&callback=test');
echo $res->getBody();
?>
注意。
- 为了测试上述代码,你需要安装Guzzle HTTP客户端。
- 你应该用你从themoviedb.org获得的密钥替换
api_key的值。 - 你也可以修改链接以返回不同的数据。
在早期的Laravel版本中,Guzzle HTTP Client被用来作为进行HTTP请求的主要方式。
HTTP客户端
现在我们已经对Guzzle HTTP客户端的工作原理有了一些了解, 让我们来关注一下新的HTTP Client.为什么Laravel的创造者会从那个简单的实现迁移到新的HTTP Client ?有什么不同吗?
一个框架的目标是使程序员的生活更容易,同时减少开发周期。作为一个经验法则, 你应该尽量减少代码,使其更有效率,并消除不必要的语句。
这正是HTTP Client ,它只是对Guzzle HTTP Client 。HTTP客户端促进了HTTP请求的外发,而不像过去那样需要 "不必要的代码"。
Guzzle包的安装
在整个教程中, 我们将使用PHP 7.4.x和Laravel 8.x.x. 因此, 请确保它们已经安装好, 以便继续学习.
要开始使用HTTP客户端,我们需要在我们的项目中安装Guzzle包。默认情况下, Laravel会安装这个包.
如果你不小心删除了它, 可以通过安装它:
composer require guzzlehttp/guzzle
进行HTTP请求
从Laravel 7.x开始,HTTP Client 是作为一个内置功能。通过工作实例, 我想向你展示新的HTTP请求的方式.
如果你以前使用过Postman, 你可能遇到过一些用于RESTful(Representational state transfer)服务的HTTP方法.
对于新手来说,不用担心,RESTful APIs只是使用HTTP请求来访问和使用数据。
Laravel的HTTP客户端使用的是我们上面讨论过的概念。
为了发出请求, 我们需要以下几个方法:
- POST
- GET
- PUT
- PATCH
- DELETE
如前所述, HTTP客户端从第7版开始与Laravel框架一起提供.这意味着,它是内置的,因此不需要任何安装。在Laravel中,你现在应该知道的唯一概念是Laravel Facades的使用。这是一个提供接口的类,可以直接从容器中访问对象。
作为一个简单的提醒, Laravel Facades是在命名空间中定义的.
Illuminate\Support\Facades
让我们来看看一个例子。
use Illuminate\Support\Facades\Cache;
Route::get('/cache', function () {
return Cache::get('key');
});
从上面的例子中, 我们已经展示了Laravel facade的一个使用案例,Cache, 它有一个名为get 的方法, 用来从缓存中检索项目.
如果你不熟悉facades,Laravel facades文档可能会有很大的帮助, 在你继续学习本教程之前, 请随时了解更多的信息.
现在我们已经学会了如何使用Laravel facades, 现在是时候看看如何使用HTTP Client进行请求了.还记得本教程开头的例子吗, 使用Guzzle HTTP客户端获取电影?如果你忘记了我们是如何做一个简单的GET 的请求,请查看它。
在这个例子中,让我们看看如何做一个简单的GET请求,从moviedb中获取电影。
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Http;
class MoviesController extends Controller
{
/**
* Show a list of all movies.
*
* @return Response
*/
public function index()
{
$response =
Http::get('https://api.themoviedb.org/3/movie/550?api_key=APIKEY');
return response()->json($response);
}
}
注意:-themoviedb.org给每个开发者一个API密钥来使用他们的服务。因此,我们建议你通过themoviedb.org与他们创建一个。
请自由修改上面的链接为任何其他链接。
要在Postman上测试这段代码,通过导航进入你的项目根目录来启动你的服务器,如下图所示。
cd /var/www/html/TestHttp
运行php artisan serve ,启动你的应用程序,复制这个链接并粘贴到Postman上,确保HTTP方法是GET ,然后按下发送按钮来获取数据。
恭喜你, 你已经使用Laravel的内置功能, HTTP客户端做了你的第一个HTTP请求.
HTTP响应
如果你正确地运行了上面的例子, 你会收到一个如下的响应:
{
"adult": false,
"backdrop_path": "/52AfXWuXCHn3UjD17rBruA9f5qb.jpg",
"belongs_to_collection": null,
"budget": 63000000,
"genres": [
{
"id": 18,
"name": "Drama"
}
],
"homepage": "http://www.foxmovies.com/movies/fight-club",
"id": 550,
"imdb_id": "tt0137523",
"original_language": "en",
"original_title": "Fight Club",
"overview": "A ticking-time-bomb insomniac and a slippery soap salesman channel primal male aggression into a shocking new form of therapy. Their concept catches on, with underground \"fight clubs\" forming in every town, until an eccentric gets in the way and ignites an out-of-control spiral toward oblivion.",
"popularity": 45.184,
"poster_path": "/bptfVGEQuv6vDTIMVCHjJ9Dz8PX.jpg",
"production_companies": [
{
"id": 508,
"logo_path": "/7PzJdsLGlR7oW4J0J5Xcd0pHGRg.png",
"name": "Regency Enterprises",
"origin_country": "US"
},
{
"id": 711,
"logo_path": "/tEiIH5QesdheJmDAqQwvtN60727.png",
"name": "Fox 2000 Pictures",
"origin_country": "US"
},
{
"id": 20555,
"logo_path": "/hD8yEGUBlHOcfHYbujp71vD8gZp.png",
"name": "Taurus Film",
"origin_country": "DE"
},
{
"id": 54051,
"logo_path": null,
"name": "Atman Entertainment",
"origin_country": ""
},
{
"id": 54052,
"logo_path": null,
"name": "Knickerbocker Films",
"origin_country": "US"
},
{
"id": 25,
"logo_path": "/qZCc1lty5FzX30aOCVRBLzaVmcp.png",
"name": "20th Century Fox",
"origin_country": "US"
},
{
"id": 4700,
"logo_path": "/A32wmjrs9Psf4zw0uaixF0GXfxq.png",
"name": "The Linson Company",
"origin_country": ""
}
],
"production_countries": [
{
"iso_3166_1": "DE",
"name": "Germany"
},
{
"iso_3166_1": "US",
"name": "United States of America"
}
],
"release_date": "1999-10-15",
"revenue": 100853753,
"runtime": 139,
"spoken_languages": [
{
"english_name": "English",
"iso_639_1": "en",
"name": "English"
}
],
"status": "Released",
"tagline": "Mischief. Mayhem. Soap.",
"title": "Fight Club",
"video": false,
"vote_average": 8.4,
"vote_count": 20780
}
HTTP客户端的Get 方法返回一个Illuminate\Http\Client\Response 的实例. 这个响应有几个方法可以用来获取更多的响应信息.
例如,上面的例子可以被改写成返回Illuminate\Http\Client\Response 。这个响应有一个方法,如status() ,可以用来获取HTTP响应的状态。
看一下下面的例子。
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Http;
class MoviesController extends Controller
{
/**
* Show a list of all movies.
*
* @return Response
*/
public function index()
{
$response =
Http::get('https://api.themoviedb.org/3/movie/550?api_key=APIKEY');
return $response;
}
}
?>
要从上述响应中获得状态,你只需做以下工作。
$response->status() : int;
检查响应的其他方法包括。
$response->body() : string;
$response->json() : array|mixed;
$response->ok() : bool;
$response->successful() : bool;
$response->failed() : bool;
$response->serverError() : bool;
$response->clientError() : bool;
$response->header($header) : string;
$response->headers() : array;
提出HTTP Post请求
这种方法是用来和请求一起发送额外的数据。比方说,你有一个需要用户通过API注册的应用程序。你如何在Laravel中实现这个功能?
让我们来看看一个简单的Laravel auth应用程序的例子:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
class HttpAuthController exends Controller
{
public function create(Request $request)
{
$response =
Http::post('http://example.com/users', [
'name' => 'Miller Juma',
'role' => 'Laravel Contributor',
]);
return $response;
}
}
上面的HTTP post方法接受一个数据数组作为第二个参数, 以JSON 格式发送.上面的Post方法接受username 和role, 然后这个数组被发送到指定的web应用程序的URL来注册用户.
发出HTTP PUT请求
这个方法是用来发送额外的数据和修改目标资源的请求。
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
class HttpAuthController exends Controller
{
public function create(Request $request)
{
$response =
Http::put('http://example.com/users', [
'name' => 'Wendy Brilliant',
]);
return $response;
}
}
HTTP put方法接受一个数据数组作为第二个参数,并以JSON格式发送,以修改资源。
提出HTTP删除请求
该方法用于发送额外的数据以及删除目标资源的请求。
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
class HttpAuthController exends Controller
{
public function create(Request $request)
{
$response =
Http::delete('http://example.com/users', [
'user_id' => '1',
]);
return $response;
}
}
HTTP删除方法接受一个数据数组作为第二个参数,以JSON格式发送来修改资源。
在这种情况下,删除的资源是user_id=1 。
总结
在本教程中, 我们已经学会了如何使用新的Laravel HTTP客户端.我们已经看到了如何进行GET,POST,PUT 和DELETE 请求。