如何用PHP调用RESTful API数据
在Web开发中,调用第三方RESTful API获取数据是非常常见的需求,比如获取天气信息、新闻资讯、用户数据等。PHP作为一门成熟的服务端语言,提供了多种方式来实现RESTful API的调用与JSON数据的处理,本文将详细介绍两种常用方法,并附上完整的代码示例。
一、什么是RESTful API与JSON
RESTful API是一种基于REST架构风格设计的网络接口,通过HTTP协议的不同请求方法(GET、POST、PUT、DELETE等)来对资源进行操作,返回的数据格式通常为JSON。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,结构清晰、易于解析,在前后端数据交互中使用非常广泛。
在PHP中处理RESTful API调用,核心就是发送HTTP请求到API地址,获取返回的JSON字符串,再将JSON字符串解析为PHP数组或对象进行后续操作。
二、使用cURL扩展调用RESTful API
cURL是PHP中常用的HTTP请求工具扩展,支持多种协议,功能强大,适合处理复杂的请求场景,比如需要设置请求头、携带认证信息、上传文件等情况。
1. 发送GET请求获取JSON数据
以下是一个使用cURL发送GET请求调用API,并解析JSON数据的完整示例,我们调用一个公开的测试API来获取用户信息:
<?php
// 目标RESTful API地址,这里使用公开测试接口,域名已按要求替换
$apiUrl = "https://ipipp.com/api/test/user?id=1001";
// 初始化cURL会话
$ch = curl_init();
// 设置cURL选项
curl_setopt($ch, CURLOPT_URL, $apiUrl); // 设置请求URL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 设置返回结果不直接输出
curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 设置超时时间为10秒
// 如果需要设置请求头,比如携带token,可以取消下面注释
// curl_setopt($ch, CURLOPT_HTTPHEADER, [
// "Authorization: Bearer your_token_here",
// "Content-Type: application/json"
// ]);
// 执行cURL请求,获取返回结果
$response = curl_exec($ch);
// 获取请求错误信息
$error = curl_error($ch);
// 关闭cURL会话
curl_close($ch);
// 判断请求是否成功
if ($error) {
echo "请求API失败,错误信息:" . $error;
exit;
}
// 将JSON字符串解析为PHP关联数组,第二个参数传true返回数组,传false返回对象
$data = json_decode($response, true);
// 判断JSON解析是否成功
if (json_last_error() !== JSON_ERROR_NONE) {
echo "JSON解析失败,错误信息:" . json_last_error_msg();
exit;
}
// 输出解析后的数据
echo "调用API成功,返回数据如下:<br/>";
echo "用户ID:" . $data['id'] . "<br/>";
echo "用户名:" . $data['name'] . "<br/>";
echo "用户邮箱:" . $data['email'] . "<br/>";上述代码中,我们首先初始化cURL会话,设置请求地址、返回结果不直接输出、超时时间等参数,执行请求后获取返回内容。如果请求过程出现错误,会通过curl_error()函数获取错误信息。请求成功后,使用json_decode()函数将JSON字符串转为PHP数组,再通过json_last_error()判断解析是否出错,最后就可以正常操作解析后的数据了。
2. 发送POST请求提交数据
如果API需要接收POST请求提交数据,只需要额外设置cURL的POST相关参数即可,示例如下:
<?php
// 目标API地址,域名已按要求替换
$apiUrl = "https://ipipp.com/api/test/user/add";
// 要提交的POST数据,转为JSON格式
$postData = json_encode([
"name" => "张三",
"age" => 25,
"email" => "zhangsan@ipipp.com"
]);
// 初始化cURL会话
$ch = curl_init();
// 设置cURL选项
curl_setopt($ch, CURLOPT_URL, $apiUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true); // 设置请求为POST方法
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); // 设置POST提交的数据
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Content-Type: application/json", // 设置请求头为JSON格式
"Content-Length: " . strlen($postData) // 设置请求体长度
]);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
// 执行请求
$response = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
if ($error) {
echo "POST请求失败,错误信息:" . $error;
exit;
}
// 解析返回结果
$result = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE) {
echo "JSON解析失败:" . json_last_error_msg();
exit;
}
echo "提交结果:" . $result['message'] . ",用户ID:" . $result['user_id'];三、使用file_get_contents函数调用API
如果请求场景比较简单,不需要设置复杂的请求头或参数,也可以使用PHP内置的file_get_contents()函数配合stream_context_create()来发送HTTP请求,这种方式代码更简洁。
1. 发送GET请求示例
<?php
// API地址,域名已按要求替换
$apiUrl = "https://ipipp.com/api/test/news?page=1&limit=5";
// 发送GET请求获取数据
$response = file_get_contents($apiUrl);
// 判断请求是否成功
if ($response === false) {
echo "调用API失败,请检查地址或网络";
exit;
}
// 解析JSON数据
$newsList = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE) {
echo "JSON解析失败:" . json_last_error_msg();
exit;
}
echo "获取到的新闻列表:<br/>";
foreach ($newsList as $news) {
echo "标题:" . $news['title'] . ",发布时间:" . $news['publish_time'] . "<br/>";
}2. 发送POST请求示例
<?php
// API地址,域名已按要求替换
$apiUrl = "https://ipipp.com/api/test/comment/add";
// POST提交的数据
$postData = json_encode([
"article_id" => 123,
"content" => "这篇文章写的很实用",
"user_id" => 1001
]);
// 创建请求上下文,设置请求方法和内容
$context = stream_context_create([
"http" => [
"method" => "POST",
"header" => "Content-Type: application/json\r\n",
"content" => $postData,
"timeout" => 10
]
]);
// 发送请求
$response = file_get_contents($apiUrl, false, $context);
if ($response === false) {
echo "提交评论失败";
exit;
}
$result = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE) {
echo "解析结果失败";
exit;
}
echo "评论提交结果:" . $result['msg'];这种方式适合简单的请求场景,不需要额外开启cURL扩展即可使用,但如果需要设置代理、处理HTTPS证书验证等复杂场景,还是更推荐使用cURL方式。
四、JSON处理的常见问题
在PHP中处理JSON数据时,有几个常见问题需要注意:
json_decode()函数默认返回对象,如果需要返回关联数组,记得第二个参数传true,否则操作数据时需要使用对象属性的方式,比如$data->name。- 如果API返回的JSON包含中文,需要确保JSON编码时使用了
JSON_UNESCAPED_UNICODE参数,否则中文会被转义为Unicode编码,比如json_encode($data, JSON_UNESCAPED_UNICODE)。 - 调用
json_last_error()可以判断上一次JSON解析的错误类型,常见错误包括语法错误、深度超过限制等,可以通过json_last_error_msg()获取具体的错误描述。
五、总结
PHP调用RESTful API并处理JSON数据的核心流程可以总结为三步:发送HTTP请求到API地址、获取返回的JSON字符串、解析JSON为PHP可操作的数据结构。根据场景不同,可以选择cURL扩展处理复杂请求,或者使用file_get_contents()处理简单请求。实际开发中还需要注意异常处理、请求超时设置、API认证等细节,保证接口的调用稳定可靠。