在我们开发小程序的时候往往需要向后端发送请求,而有些接口无法配置合法域名,比如没有备案、无法开启SSL、或者需要用户自行输入域名发送请求等等,通过使用 cURL 库创建 PHP 代理请求,我们可以轻松地绕过小程序中无法配置合法域名的限制,访问目标接口并获取响应数据。
cURL 是一款非常流行的开源网络库,支持多种协议,包括 HTTP、HTTPS、FTP 等。它提供了一个非常简单易用的 API,可以用来发送 HTTP 请求并获取响应数据,同时还能设置请求头、设置代理等功能。
为了解决无法配置合法域名的问题,我们可以通过在服务器端使用 cURL 库创建 PHP 代理请求。具体实现方式是:当小程序向服务器发起请求时,服务器先用 cURL 库向目标接口发送请求,并将响应数据返回给小程序,从而绕过了域名限制。
<?php
$url = $_GET['url'];
if (!$url) { // 如果未传递该参数,则返回HTTP 400响应状态码和错误信息
http_response_code(400);
echo 'Missing URL parameter';
exit();
}
// 创建一个cURL句柄
$ch = curl_init();
// 配置cURL请求选项
curl_setopt($ch, CURLOPT_URL, $url); // 设置请求的URL地址
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 设置是否返回响应结果
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 设置是否忽略SSL证书验证
// 发送HTTP GET请求并接收响应结果
$response = curl_exec($ch);
// 处理响应结果或请求错误
if (curl_errno($ch)) { // 如果请求发生错误,则返回HTTP 500响应状态码和错误信息
http_response_code(500);
echo 'Failed to send request: ' . curl_error($ch);
} else {
// 如果请求成功,则设置Content-Type响应头部,并将响应结果返回给客户端
header('Content-Type: application/json');
echo $response;
}
// 关闭cURL句柄并清理相关资源
curl_close($ch);
onLoad: function () {
// 在页面加载时向代理页面发起请求
this.request();
},
request: function () {
var that = this;
wx.showLoading({title: '加载中...'});
wx.request({
url: 'http://你的域名/proxy.php?url=' + encodeURIComponent('https://example.com/api'), // 将需要请求的域名作为参数传递给代理页面
success: function (res) {
wx.hideLoading();
if (res.statusCode === 200) {
// 如果请求成功,则将响应结果显示在页面上
that.setData({result: res.data.result});
} else {
// 如果请求失败,则提示用户出错信息
wx.showToast({title: '请求出错', icon: 'none'});
}
},
fail: function () {
wx.hideLoading();
// 如果请求失败,则提示用户网络错误信息
wx.showToast({title: '网络错误', icon: 'none'});
}
})
},
如果请求方法为 POST,我们需要使用 $_POST 获取请求参数,并将其格式化为 URL 编码形式,然后传递给 cURL 的 CURLOPT_POSTFIELDS 选项进行发送。修改后的 PHP 代码如下:
<?php
if($_SERVER['REQUEST_METHOD'] == 'GET') {
$url = $_GET['url'];
} else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$url = $_POST['url'];
}
if (!$url) { // 如果未传递该参数,则返回HTTP 400响应状态码和错误信息
http_response_code(400);
echo 'Missing URL parameter';
exit();
}
// 创建一个cURL句柄
$ch = curl_init();
// 配置cURL请求选项
curl_setopt($ch, CURLOPT_URL, $url); // 设置请求的URL地址
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 设置是否返回响应结果
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 设置是否忽略SSL证书验证
// 检查是否为 POST 请求,并设置请求参数
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($_POST));
}
// 发送HTTP请求并接收响应结果
$response = curl_exec($ch);
// 处理响应结果或请求错误
if (curl_errno($ch)) { // 如果请求发生错误,则返回HTTP 500响应状态码和错误信息
http_response_code(500);
echo 'Failed to send request: ' . curl_error($ch);
} else {
// 如果请求成功,则设置Content-Type响应头部,并将响应结果返回给客户端
header('Content-Type: application/json');
echo $response;
}
// 关闭cURL句柄并清理相关资源
curl_close($ch);
在以上代码中,我们使用 $_POST 获取请求参数,并使用 http_build_query() 函数将其转化为 URL 编码形式。然后,我们使用 curl_setopt() 设置 cURL 的请求方法为 POST 并设置请求参数。最后,我们发送请求并检查是否有错误发生。
在小程序端,我们可以通过 wx.request() 方法发送 POST 请求,并将请求参数传递给服务器端代理程序。示例代码如下:
wx.request({
url: 'https://yourdomain.com/proxy.php', // 代理请求的 URL
method: 'POST', // 请求方法为 POST
header: {
'content-type': 'application/x-www-form-urlencoded' // 请求头为 application/x-www-form-urlencoded
},
data: {
url: 'https://example.com/api', // 目标接口的 URL
param1: 'value1', // 请求参数1
param2: 'value2' // 请求参数2
},
success (res) {
console.log(res.data) // 响应数据
}
})
注意,在小程序端发送 POST 请求时,需要将请求参数格式化为 URL 编码形式,并将其放在 data 属性中传递给 wx.request() 方法。同时,我们还需要设置请求头为 application/x-www-form-urlencoded。