php的curl请求,包含了post,get,put,delete

php的curl请求,包含了post,get,put,delete

这段代码是一个非常实用的HTTP通信工具,可以轻松集成到需要网络通信的PHP项目中。它提供了足够的灵活性,适合多种网络请求任务。

if (!function_exists("http_curl")) {
    /**
     * 发送HTTP请求
     * @param string $url 请求的URL
     * @param array $param 请求参数
     * @param bool $https 是否使用HTTPS
     * @param string $method 请求方法,支持 GET, POST, PUT, DELETE
     * @param array $header 用户自定义的HTTP头部
     * @param int $timeout 请求超时时间(秒)
     * @param int $connectTimeout 连接超时时间(秒)
     * @param bool $followRedirects 是否跟随重定向
     * @return array 包含响应结果、HTTP状态码和其他信息的数组
     */
    function http_curl(
        string $url,
        array $param = [],
        bool $https = false,
        string $method = 'GET',
        array $header = [],
        int $timeout = 30,
        int $connectTimeout = 10,
        bool $followRedirects = false
    ) {
        $ch = curl_init();
        if (!$ch) {
            return ['success' => false, 'error' => '无法初始化cURL会话'];
        }

        // 准备URL和方法
        $url = prepareUrl($url, $param, $method);
        curl_setopt_array($ch, array(
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_TIMEOUT => $timeout,
            CURLOPT_CONNECTTIMEOUT => $connectTimeout,
            CURLOPT_FOLLOWLOCATION => $followRedirects,
            CURLOPT_SSL_VERIFYPEER => $https,
            CURLOPT_HTTPHEADER => prepareHeaders($header, $param, $method)
        ));

        // 设置请求特定的选项
        if (in_array(strtoupper($method), ['POST', 'PUT', 'DELETE'])) {
            $contentType = array_reduce($header, function ($carry, $item) {
                if (strpos($item, 'Content-Type:') === 0) {
                    return trim(substr($item, strpos($item, ':') + 1));
                }
                return $carry;
            }, 'application/json');

            $payload = ($contentType == 'application/json') ? json_encode($param, JSON_UNESCAPED_UNICODE) : $param;
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, strtoupper($method));
            curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
        }

        $result = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if ($result === false) {
            $error = curl_error($ch);
            $result = ['success' => false, 'error' => $error, 'http_code' => $httpCode];
        } else {
            $result = ['success' => true, 'data' => $result, 'http_code' => $httpCode];
        }
        curl_close($ch);
        return $result;
    }

    /**
     * 根据方法和参数准备URL
     * @param string $url 原始URL
     * @param array $param 参数数组
     * @param string $method HTTP方法
     * @return string 调整后的URL
     */
    function prepareUrl($url, $param, $method) {
        if ($method === 'GET' && !empty($param)) {
            $url .= (strpos($url, '?') === false ? '?' : '&') . http_build_query($param);
        }
        return $url;
    }

    /**
     * 准备请求头
     * @param array $headers 用户自定义的头部数组
     * @param array $param 请求的参数,用于确定内容长度
     * @param string $method HTTP方法
     * @return array 处理后的头部数组
     */
    function prepareHeaders($headers, $param, $method) {
        $contentTypeSet = false;
        foreach ($headers as $header) {
            if (strpos($header, 'Content-Type:') === 0) {
                $contentTypeSet = true;
                break;
            }
        }

        if (!$contentTypeSet && in_array(strtoupper($method), ['POST', 'PUT', 'DELETE'])) {
            $headers[] = 'Content-Type: application/json';
            $headers[] = 'Content-Length: ' . strlen(json_encode($param));
        }

        return $headers;
    }
}

调用案例

// 示例调用
$response = http_curl(
    "https://api.example.com/data",
    ['key' => 'value'],
    true,
    'POST',
  ['Authorization: Bearer your_access_token'],
    30,
    15,
    true
);
// 打印响应内容
print_r($response);

代码说明

这段PHP代码定义了一个名为http_curl的函数,用于发送HTTP请求到指定的URL,并处理这些请求的响应。这个函数提供了灵活性来调整各种HTTP请求的参数,包括请求方法、超时时间、是否跟随重定向等。以下是对函数和它的各个部分的详细介绍:
函数定义

函数名: http_curl
参数:
    string $url: 请求的目标URL。
    array $param = []: 发送请求时用的参数数组,缺省为一个空数组。
    bool $https = false: 指示是否使用HTTPS进行请求,默认为false。
    string $method = 'GET': HTTP请求方法,默认为GET。支持GET, POST, PUT, DELETE。
    array $header = []: 用户自定义的HTTP头部数组,默认为空数组。
    int $timeout = 30: 请求的超时时间,默认为30秒。
    int $connectTimeout = 10: 连接的超时时间,默认为10秒。
    bool $followRedirects = false: 是否自动跟随HTTP重定向,默认为false。

函数体

初始化: 使用curl_init初始化cURL会话。

准备URL: 通过调用prepareUrl函数,根据HTTP方法和提供的参数来准备或修改URL。

设置cURL选项:
    CURLOPT_URL: 设置请求的URL。
    CURLOPT_RETURNTRANSFER: 设置为true以返回请求的结果而非直接输出。
    CURLOPT_TIMEOUT 和 CURLOPT_CONNECTTIMEOUT: 分别设置请求和连接的超时时间。
    CURLOPT_FOLLOWLOCATION: 设置是否跟随重定向。
    CURLOPT_SSL_VERIFYPEER: 根据$https参数确定是否验证对等证书。
    CURLOPT_HTTPHEADER: 使用prepareHeaders函数准备HTTP头部。

设置请求方法和负载:
    如果方法是POST, PUT, DELETE,则设置CURLOPT_CUSTOMREQUEST为相应的方法,并准备负载(参数),这取决于Content-Type。

执行请求:
    使用curl_exec执行cURL请求。
    获取HTTP状态码。
    检查是否有错误,如果有,返回错误信息和状态码。

关闭cURL会话:
    使用curl_close结束cURL会话。

结果返回

函数返回一个数组,包含是否成功的标志、数据(或错误信息)、HTTP状态码等。
辅助函数

prepareUrl: 根据方法和参数调整URL。
prepareHeaders: 准备HTTP头部,自动添加内容类型和内容长度,如果请求方法为POST, PUT, DELETE且未设置Content-Type。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/575350.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络攻击近在咫尺:数据加密与SSL成为信息安全之盾

随着互联网的日益普及和科技的迅猛发展,网络攻击已经成为信息安全领域面临的一大难题。近期,一场网络安全实验让我们对网络攻击有了更为深刻的认识。在实验中,网络安全工程师通过模拟攻击,展示了木马植入、文件浏览、键盘监听、病…

激活IDM下载器并配置百度网盘

前言: 最近想下载一些软件,奈何不充钱的百度网盘的速度实在太慢了,不到一个G的文件夹奈何下了一晚上,只能重新找一下idm的下载了。 但是idm的正版是需要收费的,所以有白嫖党的破解版就横空出世了。 正文&#xff1a…

JavaEE——Spring Boot + jwt

目录 什么是Spring Boot jwt? 如何实现Spring Boot jwt: 1. 添加依赖 2、创建JWT工具类 3. 定义认证逻辑 4. 添加过滤器 5、 http请求测试 什么是Spring Boot jwt? Spring Boot和JWT(JSON Web Token)是一对常…

HarmonyOS hsp制作与引用

1. HarmonyOS hsp制作与引用 1.1 介绍 HSP动态共享包(模块),应用内HSP指的是专门为某一应用开发的HSP,只能被该应用内部其他HAP/HSP使用,用于应用内部代码、资源的共享。应用内HSP跟随其宿主应用的APP包一起发布,与该…

阶跃星辰:探索智能科技的星辰大海

引言 在当今快速发展的科技时代,人工智能已经成为推动社会进步的重要力量。阶跃星辰,正是在这一背景下诞生的。 阶跃星辰是一家专注于通用人工智能探索的公司,成立于2023年4月。该公司的创始团队由一群对人工智能充满热情和渴望的人组成&am…

【Python】异常、模块与包

目录 捕获异常 异常的传递 Python中的模块 模块的导入方式 as定义别名 自定义模块 Python包 第三方包 综合案例 当我们的程序遇到了BUG, 那么接下来有两种情况: ① 整个程序因为一个BUG停止运行 ② 对BUG进行提醒, 整个程序继续运行 但是在真实工作中, 我们肯定不能…

快解析搭建网站解决方案

在如今网络时代下,各行各业都需要有自己的门户网站。 企业搭建自己的门户网站,有着众多实际意义: 1.可以全面详细地介绍企业及企业产品,这是企业网站的一个最基本的功能。企业可以把任何想让大众知道的信息放到网站,当人们想知道…

http忽略ssl认证

我们在发请求时,会遇到需要ssl证书验证的报错,针对该错误以及所使用的不同的创建连接的方式,进行ssl证书忽略 忽略SSL证书的流程 简介:需要告诉client使用一个不同的TrustManager。TrustManager是一个检查给定的证书是否有效的类…

pytest参数化数据驱动(数据库/execl/yaml)

常见的数据驱动 数据结构: 列表、字典、json串 文件: txt、csv、excel 数据库: 数据库链接 数据库提取 参数化: pytest.mark.parametrize() pytest.fixture()…

vue3.0项目中运用vant的以及移动端的适配

文章目录 概要移动端的适配vant的引入开发以及打包过程中遇到的问题 概要 在Vue-Vben-Admin项目中运用vant-ui实现部分页面支持手机端h5页面的预览 移动端的适配 适配的原理 自适应 根据不同的设备的屏幕大小来自动调整尺寸,大小响应式 会随着屏幕的变动而自动调整…

[实验]Keil 4下仿真三星2440A芯片的汇编及CPIO控制实验

一、安装Keil uVision4 (详细安装过程忽略) 点击finish完成安装 二、新建项目,导入项目文件 选择对应的芯片,此处我们选择三星的S3C2440A,点击OK 在Source Group 1处右键,点击Add Files to "Sourcce Group 1’…将下图…

每日一题(PTAL2-022 ):重排链表--排坑

它的测试数据有可能有分裂节点&#xff0c;所以需要计算实际所给链表的长度 #include<bits/stdc.h> using namespace std; struct Node{int val;int next; }x[100005]; int main(){int j0;int start;int n;int ad1,num,ad2;cin>>start>>n;for(int i0;i<n…

从 MySQL 到 ClickHouse 实时数据同步 —— Debezium + Kafka 表引擎

目录 一、总体架构 二、安装配置 MySQL 主从复制 三、安装配置 ClickHouse 集群 四、安装 JDK 五、安装配置 Zookeeper 集群 六、安装配置 Kafaka 集群 七、安装配置 Debezium-Connector-MySQL 插件 1. 创建插件目录 2. 解压文件到插件目录 3. 配置 Kafka Connector …

【机器学习-18】特征筛选:提升模型性能的关键步骤

一、引言 在机器学习领域&#xff0c;特征筛选是一个至关重要的预处理步骤。随着数据集的日益庞大和复杂&#xff0c;特征的数量往往也随之激增。然而&#xff0c;并非所有的特征都对模型的性能提升有所贡献&#xff0c;有些特征甚至可能是冗余的、噪声较大的或者与目标变量无关…

SpringBoot Aop使用篇

Getting Started SpringBoot AOP的实践 AOP相关的概念&#xff1a; Aspect&#xff08;切面&#xff09;&#xff1a; Aspect 声明类似于 Java 中的类声明&#xff0c;在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。就是抽离出来的逻辑类&#xff0c;比如日志、权限…

《苍穹外卖》Day08部分知识点记录

一、useGeneratedKeys和keyProperty useGeneratedKeys和keyProperty是<insert>标签中的两个属性&#xff0c;用于处理自动生成的主键值。 1. useGeneratedKeys userGeneratedKeys"true"表示启用自动生成主键功能&#xff1b;当useGeneratedKeys设置为true时…

VScode使用cmake编译

一&#xff1a;输入 ctrlshiftp打开用于命令执行的输入框 二&#xff1a;输入cmake&#xff0c;选择quick start 模式 三&#xff1a;选择版本最高的gcc版本 四&#xff1a;输入项目名称 选择C 五&#xff1a;选择executable 这样便创建好了最简单的cmake例程&#xff0c;一个…

同态加密原理解析

目录 1.数学介绍2.使用多项式环进行加密2.1 私钥和公钥的产生2.2 加密2.3 解密 3.同态计算3.1 同态加法3.2 同态乘法 1.数学介绍 同态加密方案基于一个难以计算的问题Ring Learning with Errorsred。这些方案中的数据在加密和未加密时都用多项式表示。 这里举一个简单的多项式…

AWTK MODBUS Client channel 模型

名称&#xff1a;modbus_client_channel 功能&#xff1a;通过 modbus 协议访问远程 slave 设备上的数据&#xff0c;需要配合 modbus_client模型一起使用。用于将 modbus client 中的 channel 包装成view_model或者view_model_array 一般来说不需要&#xff0c;直接使用modbus…

docker常用基本命令

把jar包和 dockerfile文件放到同一目录下#构建Docker镜像 注意后面的 . 不能省略 docker build -t your-image-name .#运行并创建一个容器 docker run -d -p 8080:8080 --name container_name your-image-name# 停止容器 767fce4cb990 容器ID (容器名也可以) docker stop 767f…