封装PHP用于发送GET和POST请求的公共方法

封装了ThinkPHP用于发送GET和POST请求的公共方法。这个方法可以放在你的公共函数文件中,或者创建一个独立的类来管理这些请求。

php 复制代码
<?php
namespace app\common\utils;

use think\facade\Log;
use think\exception\HttpException;

class HttpRequest
{
    /**
     * 发送GET请求
     *
     * @param string $url 请求的URL
     * @param array $params URL参数
     * @param array $headers 请求头
     * @return mixed
     */
    public static function get($url, $params = [], $headers = [])
    {
        $ch = curl_init();
        if (!empty($params)) {
            $url .= '?' . http_build_query($params);
        }
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        if (!empty($headers)) {
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        }

        $output = curl_exec($ch);
        $error = curl_error($ch);
        curl_close($ch);

        if ($error) {
            Log::error('HTTP GET Request Error: ' . $error);
            throw new HttpException(500, 'HTTP GET Request Error: ' . $error);
        }

        return json_decode($output, true);
    }

    /**
     * 发送POST请求
     *
     * @param string $url 请求的URL
     * @param array $data POST数据
     * @param array $headers 请求头
     * @return mixed
     */
    public static function post($url, $data = [], $headers = [])
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
        if (!empty($headers)) {
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        }

        $output = curl_exec($ch);
        $error = curl_error($ch);
        curl_close($ch);

        if ($error) {
            Log::error('HTTP POST Request Error: ' . $error);
            throw new HttpException(500, 'HTTP POST Request Error: ' . $error);
        }

        return json_decode($output, true);
    }
}

使用示例

你可以在你的控制器或模型中使用这个封装的公共方法来发送GET和POST请求。例如:

php 复制代码
use app\common\utils\HttpRequest;

class SomeController extends Controller
{
    public function someAction()
    {
        // 发送GET请求
        $getResponse = HttpRequest::get('https://api.example.com/data', ['param1' => 'value1']);

        // 发送POST请求
        $postResponse = HttpRequest::post('https://api.example.com/submit', ['field1' => 'value1']);

        // 处理响应
        if ($getResponse && $postResponse) {
            // 处理成功响应
        } else {
            // 处理错误
        }
    }
}

注意事项

  1. 错误处理:在生产环境中,确保有适当的错误处理机制。
  2. 超时设置:根据实际需求调整超时时间。
  3. 安全性:发送请求时注意数据的安全性,尤其是敏感信息的传输。

如果遇到报错:HTTP GET Request Error: SSL certificate problem: unable to get local issuer certificate 。说明ssl证书没配置,我这里懒得配置,你可以自行百度,所以我就干脆禁用检查ssl证书,当然不建议各位这样做!

php 复制代码
<?php
namespace app\common\utils;

use think\facade\Log;
use think\exception\HttpException;

class HttpRequest
{
    /**
     * 发送GET请求
     *
     * @param string $url 请求的URL
     * @param array $params URL参数
     * @param array $headers 请求头
     * @return mixed
     */
    public static function get($url, $params = [], $headers = [])
    {
        $ch = curl_init();
        if (!empty($params)) {
            $url .= '?' . http_build_query($params);
        }
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 禁用SSL验证
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 禁用SSL验证
        if (!empty($headers)) {
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        }

        $output = curl_exec($ch);
        $error = curl_error($ch);
        curl_close($ch);

        if ($error) {
            Log::error('HTTP GET Request Error: ' . $error);
            throw new HttpException(500, 'HTTP GET Request Error: ' . $error);
        }

        return json_decode($output, true);
    }

    /**
     * 发送POST请求
     *
     * @param string $url 请求的URL
     * @param array $data POST数据
     * @param array $headers 请求头
     * @return mixed
     */
    public static function post($url, $data = [], $headers = [])
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 禁用SSL验证
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 禁用SSL验证
        if (!empty($headers)) {
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        }

        $output = curl_exec($ch);
        $error = curl_error($ch);
        curl_close($ch);

        if ($error) {
            Log::error('HTTP POST Request Error: ' . $error);
            throw new HttpException(500, 'HTTP POST Request Error: ' . $error);
        }

        return json_decode($output, true);
    }
}
相关推荐
李妍.1 天前
02Numpy基础(上)
开发语言·python
TheBestRucy1 天前
Python 九阳神功之贰:面向对象(下)
开发语言·python
AI_小站1 天前
刚面完百度的 Agent 开发岗,我才发现:世界就是个巨大的草台班子
java·开发语言·人工智能·spring·百度·langchain
felixking1 天前
C++20 协程
开发语言·c++·协程
Zane1994121 天前
CAS 与原子类:Java 如何实现无锁编程
java·开发语言
码农颜1 天前
6.3 主函数流程剖析
开发语言·php
TheBestRucy1 天前
Python 九阳神功:从零筑基到线程飞升
服务器·开发语言·网络·人工智能·python
研☆香1 天前
聊一聊前端的常见字 关键字
开发语言·前端·javascript
草莓橙子碗1 天前
Claude 使用指南
开发语言·python
longxiaozhang61 天前
C# Array类:数组其实没那么难
开发语言·c#