laravel 8 推荐使用内置 http client 发起 get 请求,它基于 guzzle,更简洁安全、自动处理 json 解析与异常;不推荐手动使用原生 curl。

在 Laravel 8 中,推荐使用内置的 HTTP Client(基于 Guzzle)发起 GET 请求,而不是直接写 cURL。它更简洁、安全、可测试,且自动处理 JSON 解析、异常、连接池等。
使用 Laravel HTTP Client 发起 GET 请求
Laravel 8 默认已集成 Illuminate\Support\Facades\Http,无需额外安装(底层依赖 Guzzle 7+)。
- 基础 GET 请求(返回响应对象):
$response = Http::get('https://api.example.com/users'); - 获取响应内容(字符串):
$body = $response->body(); // 原始字符串
- 自动解析 JSON 并转为数组或对象:
$data = $response->json(); // 返回关联数组(默认)<br>$data = $response->object(); // 返回 stdClass 对象
- 带查询参数的 GET:
Http::get('https://api.example.com/search', [<br> 'q' => 'laravel',<br> 'limit' => 10<br>]);
添加请求头、超时和错误处理
生产环境建议设置超时和检查状态码,避免请求挂起或静默失败。
利用农业相机拍摄植物叶片高分辨率图像,通过AI视觉技术检测叶片卷曲方向(向上卷曲或向下卷曲)
- 设置超时(秒)和自定义 Header:
$response = Http::timeout(10)<br> ->withHeaders(['X-API-Key' => 'your-key'])<br> ->get('https://api.example.com/data'); - 判断响应是否成功(2xx 状态码):
if ($response->successful()) {<br> $data = $response->json();<br>} else {<br> \Log::error('API failed: ' . $response->status());<br>} - 捕获网络异常(如 DNS 失败、连接超时):
try {<br> $response = Http::timeout(5)->get('https://api.example.com');<br>} catch (\Illuminate\Http\Client\ConnectionException $e) {<br> \Log::error('Connection failed: ' . $e->getMessage());<br>}
在控制器或服务类中使用示例
保持逻辑清晰,建议将 API 调用封装到 Service 类中,而非直接写在控制器里。
- 例如创建
app/Services/ApiService.php:namespace App\Services;<br><br>use Illuminate\Support\Facades\Http;<br><br>class ApiService<br>{<br> public function fetchUsers()<br> {<br> return Http::timeout(8)<br> ->retry(2, 100) // 失败时重试 2 次,间隔 100ms<br> ->get('https://jsonplaceholder.typicode.com/users')<br> ->throw() // 抛出异常(4xx/5xx)<br> ->json();<br> }<br>} - 在控制器中调用:
use App\Services\ApiService;<br><br>public function index(ApiService $api)<br>{<br> $users = $api->fetchUsers();<br> return response()->json($users);<br>}
不推荐:手动使用原生 cURL
虽然可行,但需自行处理编码、SSL、重定向、超时、错误码、JSON 解析等,易出错且难维护:
- 示例(仅作对比,勿在 Laravel 项目中使用):
$ch = curl_init();<br>curl_setopt($ch, CURLOPT_URL, 'https://api.example.com');<br>curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);<br>curl_setopt($ch, CURLOPT_TIMEOUT, 10);<br>$result = curl_exec($ch);<br>if (curl_errno($ch)) { /* handle error */ }<br>curl_close($ch);<br>$data = json_decode($result, true); - 问题:无 Laravel 服务容器集成、无法 mock 测试、无自动重试、SSL 验证需手动配置等。










