本文目录导读:

在PHP中调用远程接口有多种方式,我来详细介绍各种方法:
cURL 方式(最常用)
基础 GET 请求
<?php
// 初始化 cURL
$ch = curl_init();
// 设置 URL
curl_setopt($ch, CURLOPT_URL, 'https://api.example.com/users');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过SSL验证(开发环境)
// 执行请求
$response = curl_exec($ch);
// 检查错误
if (curl_errno($ch)) {
echo 'Error: ' . curl_error($ch);
}
// 关闭连接
curl_close($ch);
// 处理响应
$data = json_decode($response, true);
var_dump($data);
?>
带参数的 GET 请求
<?php
$params = [
'page' => 1,
'limit' => 10,
'search' => 'keyword'
];
$url = 'https://api.example.com/users?' . http_build_query($params);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
?>
POST 请求(JSON 格式)
<?php
$data = [
'name' => 'John Doe',
'email' => 'john@example.com',
'age' => 25
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.example.com/users');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Accept: application/json',
'Authorization: Bearer YOUR_TOKEN' // 如有认证需求
]);
$response = curl_exec($ch);
curl_close($ch);
?>
完整封装的 cURL 方法
<?php
function callAPI($method, $url, $data = null, $headers = []) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
// 设置请求方法
switch ($method) {
case 'POST':
curl_setopt($ch, CURLOPT_POST, true);
if ($data) {
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
}
break;
case 'PUT':
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
if ($data) {
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
}
break;
case 'DELETE':
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
break;
case 'GET':
default:
if ($data) {
$url = $url . '?' . http_build_query($data);
curl_setopt($ch, CURLOPT_URL, $url);
}
}
// 设置默认请求头
$defaultHeaders = [
'Content-Type: application/json',
'Accept: application/json'
];
$allHeaders = array_merge($defaultHeaders, $headers);
curl_setopt($ch, CURLOPT_HTTPHEADER, $allHeaders);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (curl_errno($ch)) {
throw new Exception('Curl error: ' . curl_error($ch));
}
curl_close($ch);
return [
'status_code' => $httpCode,
'response' => json_decode($response, true)
];
}
// 使用示例
try {
$result = callAPI('GET', 'https://api.example.com/users');
print_r($result);
$result = callAPI('POST', 'https://api.example.com/users', [
'name' => 'New User',
'email' => 'user@example.com'
]);
print_r($result);
} catch (Exception $e) {
echo 'Error: ' . $e->getMessage();
}
?>
file_get_contents 方式(简单但功能有限)
<?php
// GET 请求
$url = 'https://api.example.com/users?page=1';
$options = [
'http' => [
'method' => 'GET',
'header' => "Accept: application/json\r\n" .
"User-Agent: PHP\r\n"
],
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false
]
];
$context = stream_context_create($options);
$response = @file_get_contents($url, false, $context);
if ($response === false) {
echo 'Error: Unable to connect to API';
} else {
$data = json_decode($response, true);
print_r($data);
}
// POST 请求
$data = ['name' => 'Test', 'email' => 'test@example.com'];
$options = [
'http' => [
'method' => 'POST',
'header' => "Content-Type: application/json\r\n" .
"Accept: application/json\r\n",
'content' => json_encode($data),
'timeout' => 30
]
];
$context = stream_context_create($options);
$response = @file_get_contents('https://api.example.com/users', false, $context);
?>
Guzzle HTTP Client(第三方库,功能强大)
安装 Guzzle
composer require guzzlehttp/guzzle
使用 Guzzle
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
// 创建客户端
$client = new Client([
'base_uri' => 'https://api.example.com',
'timeout' => 30.0,
'headers' => [
'Accept' => 'application/json',
'User-Agent' => 'MyApp/1.0'
]
]);
// GET 请求
try {
$response = $client->get('/users', [
'query' => ['page' => 1, 'limit' => 10],
'headers' => [
'Authorization' => 'Bearer YOUR_TOKEN'
]
]);
$statusCode = $response->getStatusCode();
$body = $response->getBody()->getContents();
$data = json_decode($body, true);
echo "Status: $statusCode\n";
print_r($data);
} catch (RequestException $e) {
if ($e->hasResponse()) {
echo $e->getResponse()->getBody()->getContents();
} else {
echo $e->getMessage();
}
}
// POST 请求
try {
$response = $client->post('/users', [
'json' => [
'name' => 'John',
'email' => 'john@example.com'
],
'headers' => [
'X-Custom-Header' => 'value'
]
]);
$result = json_decode($response->getBody(), true);
print_r($result);
} catch (RequestException $e) {
echo 'Error: ' . $e->getMessage();
}
// 异步请求
$promise = $client->getAsync('/users');
$promise->then(
function ($response) {
echo 'Success: ' . $response->getStatusCode();
},
function ($exception) {
echo 'Failed: ' . $exception->getMessage();
}
);
$promise->wait();
?>
实时请求处理示例
带超时和重试机制
<?php
function requestWithRetry($url, $maxRetries = 3) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$response = false;
for ($attempt = 1; $attempt <= $maxRetries; $attempt++) {
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response !== false && $httpCode >= 200 && $httpCode < 300) {
curl_close($ch);
return json_decode($response, true);
}
// 等待后重试
sleep(pow(2, $attempt - 1)); // 1s, 2s, 4s
}
curl_close($ch);
if ($response === false) {
throw new Exception('Request failed after ' . $maxRetries . ' attempts');
}
return null;
}
// 使用示例
try {
$data = requestWithRetry('https://api.example.com/data');
print_r($data);
} catch (Exception $e) {
echo 'Error: ' . $e->getMessage();
}
?>
处理不同的响应格式
<?php
function handleResponse($response) {
// 检测响应类型
$contentType = '';
if (isset($response['headers']['content-type'][0])) {
$contentType = $response['headers']['content-type'][0];
}
if (strpos($contentType, 'application/json') !== false) {
return json_decode($response['body'], true);
} elseif (strpos($contentType, 'text/xml') !== false ||
strpos($contentType, 'application/xml') !== false) {
// 解析XML
return simplexml_load_string($response['body']);
} elseif (strpos($contentType, 'text/csv') !== false) {
// 解析CSV
$lines = explode("\n", $response['body']);
$result = [];
foreach ($lines as $line) {
$result[] = str_getcsv($line);
}
return $result;
}
// 默认返回原始内容
return $response['body'];
}
// 完整请求示例
function makeRequest($method, $url, $data = null, $headers = []) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 设置请求头和内容
$curlHeaders = array_merge([
'User-Agent: PHP/Client',
'Accept: */*'
], $headers);
curl_setopt($ch, CURLOPT_HTTPHEADER, $curlHeaders);
// 设置方法
if ($method === 'POST') {
curl_setopt($ch, CURLOPT_POST, true);
if ($data) {
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
}
} elseif ($method === 'PUT' || $method === 'DELETE') {
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
if ($data && $method === 'PUT') {
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
}
}
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$info = curl_getinfo($ch);
curl_close($ch);
return [
'status' => $httpCode,
'body' => $response,
'headers' => $info
];
}
// 使用示例
$response = makeRequest('GET', 'https://api.example.com/users');
$data = handleResponse($response);
print_r($data);
?>
选择建议
- 简单项目:使用 cURL,它是PHP内置的,无需额外依赖
- 复杂项目:使用 Guzzle,它提供了更丰富的功能(异步、中间件、缓存等)
- 快速测试:使用 file_get_contents,简单但不推荐生产环境使用
- 异步需求:Guzzle 的 async 特性是最佳选择
最佳实践
- 设置超时:防止请求挂起
- 添加错误处理:捕获网络错误和 HTTP 错误
- 日志记录:记录请求和响应
- 连接复用:使用长连接提高性能
- 安全性:使用 HTTPS,验证 SSL 证书
- 数据验证:验证响应数据格式
希望这些示例能帮助你!如果有具体需求,可以告诉我,我会提供更针对性的建议。