本文目录导读:

Laravel 的 HTTP 客户端是基于 Guzzle 的封装,提供了简洁优雅的 API 来处理 HTTP 请求,以下是详细的使用指南:
基础用法
发送 GET 请求
use Illuminate\Support\Facades\Http;
// 简单 GET 请求
$response = Http::get('https://api.example.com/users');
// 带查询参数的 GET 请求
$response = Http::get('https://api.example.com/users', [
'page' => 1,
'limit' => 10,
'sort' => 'desc'
]);
// 获取响应数据
$data = $response->json(); // 返回数组
$body = $response->body(); // 返回原始字符串
$status = $response->status(); // 状态码
发送 POST 请求
// 基本 POST 请求
$response = Http::post('https://api.example.com/users', [
'name' => '张三',
'email' => 'zhangsan@example.com',
'password' => 'secret123'
]);
// JSON 格式
$response = Http::post('https://api.example.com/users', [
'name' => '李四',
'skills' => ['PHP', 'Laravel', 'JavaScript']
]);
发送 PUT/PATCH/DELETE 请求
// PUT 请求
$response = Http::put('https://api.example.com/users/1', [
'name' => '更新后的名字'
]);
// PATCH 请求
$response = Http::patch('https://api.example.com/users/1', [
'name' => '部分更新'
]);
// DELETE 请求
$response = Http::delete('https://api.example.com/users/1');
请求头设置
// 基础认证
$response = Http::withBasicAuth('username', 'password')
->get('https://api.example.com/protected');
// Bearer Token
$response = Http::withToken('your-token-here')
->get('https://api.example.com/user');
// 自定义请求头
$response = Http::withHeaders([
'Accept' => 'application/json',
'X-Custom-Header' => 'Custom Value',
'User-Agent' => 'Laravel App/1.0'
])->get('https://api.example.com/data');
// 传递 Array 头
$response = Http::withHeaders([
'Accept-Language' => 'zh-CN',
])->get('https://api.example.com');
超时和重试
// 设置超时时间(秒)
$response = Http::timeout(30)
->get('https://api.example.com');
// 连接超时
$response = Http::connectTimeout(5)
->get('https://api.example.com');
// 重试配置
$response = Http::retry(3, 100) // 重试次数,延迟毫秒
->get('https://api.example.com');
响应处理
$response = Http::get('https://api.example.com/users');
// 检查状态
if ($response->successful()) {
// 2xx 状态码
}
if ($response->failed()) {
// 非 2xx 状态码
}
if ($response->clientError()) {
// 4xx 客户端错误
}
if ($response->serverError()) {
// 5xx 服务器错误
}
if ($response->status() == 404) {
// 特定状态码
}
// 获取响应内容
$json = $response->json(); // 数组
$object = $response->object(); // 对象
$collection = $response->collect(); // Collection 实例
$headers = $response->headers(); // 响应头
进阶用法
并发请求
use Illuminate\Http\Client\Pool;
$responses = Http::pool(function (Pool $pool) {
return [
$pool->get('https://api.github.com/users/github'),
$pool->get('https://api.github.com/users/laravel'),
$pool->post('https://api.example.com/login', [
'email' => 'test@example.com',
'password' => 'secret'
])
];
});
$response1 = $responses[0];
$response2 = $responses[1];
$response3 = $responses[2];
文件上传
use Illuminate\Http\Client\Multipart;
// 常规上传
$response = Http::attach(
'avatar',
file_get_contents('/path/to/image.jpg'),
'avatar.jpg'
)->post('https://api.example.com/upload');
// 多文件上传
$response = Http::attach([
'files' => fopen('/path/to/file1.pdf', 'r'),
'files2' => fopen('/path/to/file2.pdf', 'r')
])->post('https://api.example.com/upload');
下载文件
$response = Http::get('https://example.com/file.zip');
// 保存到本地
$response->body();
Storage::disk('local')->put('file.zip', $response->body());
// 或者直接流式下载
$response = Http::timeout(300)->get('https://example.com/large-file.zip');
$response->toPsrResponse()->getBody()->getContents();
自定义配置
// 禁用 SSL 验证(仅限开发环境)
$response = Http::withoutVerifying()
->get('https://api.example.com');
// 自定义端口
$response = Http::get('https://api.example.com:8080/api');
// 代理设置
$response = Http::withOptions([
'proxy' => 'http://proxy.example.com:8080',
'verify' => false
])->get('https://api.example.com');
错误处理最佳实践
use Illuminate\Support\Facades\Http;
use Illuminate\Http\Client\RequestException;
try {
$response = Http::timeout(30)
->withToken($token)
->post('https://api.example.com/export', $data);
if ($response->successful()) {
return $response->json();
}
// 记录错误
Log::error('API 调用失败', [
'url' => 'https://api.example.com/export',
'status' => $response->status(),
'response' => $response->body()
]);
return null;
} catch (RequestException $e) {
Log::error('HTTP 请求异常', [
'message' => $e->getMessage(),
'response' => $e->response?->body()
]);
return null;
}
高级配置
使用配置中心
在 config/services.php 中添加:
'api' => [
'base_url' => env('API_BASE_URL', 'https://api.example.com'),
'timeout' => env('API_TIMEOUT', 30),
'key' => env('API_KEY'),
],
然后在代码中使用:
$response = Http::baseUrl(config('services.api.base_url'))
->timeout(config('services.api.timeout'))
->withToken(config('services.api.key'))
->get('/v1/users');
使用宏定义
在 AppServiceProvider 的 boot() 方法中:
use Illuminate\Support\Facades\Http;
Http::macro('api', function () {
return Http::baseUrl(config('services.api.base_url'))
->withToken(auth()->user()->api_token ?? '');
});
// 使用方式
$response = Http::api()->get('/user/profile');
测试技巧
use Illuminate\Support\Facades\Http;
// 模拟 HTTP 响应
Http::fake([
'https://api.github.com/*' => Http::response([
'name' => 'Laravel',
'description' => 'PHP framework'
], 200),
]);
// 测试代码
$response = Http::get('https://api.github.com/repos/laravel/framework');
$this->assertEquals('Laravel', $response->json()['name']);
性能优化建议
- 复用连接:使用
Http::pool()处理并发请求 - 合理设置超时:避免长时间阻塞
- 使用连接池:在
config/http.php中配置 - 对响应进行缓存:对于不经常变化的API响应
// 缓存 API 响应
$users = Cache::remember('api-users', 3600, function () {
return Http::get('https://api.example.com/users')->json();
});
这份指南涵盖了 Laravel HTTP 客户端的大部分常用功能,根据项目需求,可以选择性地使用这些特性来构建强大的 API 集成。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播