thinkphp中对请求封装
请求的封装
//调用
$res = Http::post($this->baseUrl . $url,$params,[CURLOPT_HTTPHEADER => ['Content-Type: application/json','Content-Length: ' . strlen($params),],]);<?php
namespace fast;
/*** 字符串类*/
class Http
{/*** 发送一个POST请求*/public static function post($url, $params = [], $options = []) {$req = self::sendRequest($url, $params, 'POST', $options);return $req['ret'] ? $req['msg'] : '';}/*** 发送一个GET请求*/public static function get($url, $params = [], $options = []) {$req = self::sendRequest($url, $params, 'GET', $options);return $req['ret'] ? $req['msg'] : '';}/*** 发送一个POST JSON请求*/public static function postJson($url, $params = [], $options = []) {is_array($params) && $params = json_encode($params, JSON_UNESCAPED_UNICODE);$req = self::sendRequest($url, $params, 'POST', array_merge_replace([CURLOPT_HTTPHEADER => ['Content-Type: application/json','Content-Length: ' . strlen($params),],], $options));return $req['ret'] ? $req['msg'] : '';}/*** CURL发送Request请求,含POST和REQUEST* @param string $url 请求的链接* @param mixed $params 传递的参数* @param string $method 请求的方法* @param mixed $options CURL的参数* @return array*/public static function sendRequest($url, $params = [], $method = 'POST', $options = []) {$method = strtoupper($method);$protocol = substr($url, 0, 5);if (stripos($url, '/product/collectorUploadImg') !== false || stripos($url, '/assemblers/upload') !== false || stripos($url, '/product/tinymecFileAllow') !== false|| stripos($url, '/refund/uploadFile') !== false || stripos($url, '/invoice/uploadPdfLimitTwoMega') !== false|| stripos($url, '/base/upload/uploadImgLimitForApi') !== false || stripos($url, '/item/seller/itemPublish/publishItemForApi') !== false|| stripos($url, '/product/contractUploadImg') !== false) {//国铁推送文件信息$query_string = $params;} else {$query_string = is_array($params) ? http_build_query($params) : $params;}$ch = curl_init();$defaults = [];if ('GET' == $method) {$geturl = $query_string ? $url . (stripos($url, "?") !== FALSE ? "&" : "?") . $query_string : $url;$defaults[CURLOPT_URL] = $geturl;} else {$defaults[CURLOPT_URL] = $url;if ($method == 'POST') {$defaults[CURLOPT_POST] = 1;} else {$defaults[CURLOPT_CUSTOMREQUEST] = $method;}$defaults[CURLOPT_POSTFIELDS] = $query_string;}$defaults[CURLOPT_HEADER] = FALSE;$defaults[CURLOPT_USERAGENT] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.98 Safari/537.36";$defaults[CURLOPT_FOLLOWLOCATION] = TRUE;$defaults[CURLOPT_RETURNTRANSFER] = TRUE;$defaults[CURLOPT_CONNECTTIMEOUT] = 3;$defaults[CURLOPT_TIMEOUT] = 3000;// disable 100-continuecurl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));if ('https' == $protocol) {$defaults[CURLOPT_SSL_VERIFYPEER] = FALSE;$defaults[CURLOPT_SSL_VERIFYHOST] = FALSE;}curl_setopt_array($ch, (array) $options + $defaults);$ret = curl_exec($ch);$err = curl_error($ch);if (FALSE === $ret || !empty($err)) {$errno = curl_errno($ch);$info = curl_getinfo($ch);curl_close($ch);return ['ret'=>FALSE, 'errno'=>$errno, 'msg'=>$err, 'info'=>$info];}curl_close($ch);return ['ret'=>TRUE, 'msg'=>$ret];}/*** 异步发送一个请求* @param string $url 请求的链接* @param mixed $params 请求的参数* @param string $method 请求的方法* @return boolean TRUE*/public static function sendAsyncRequest($url, $params = [], $method = 'POST') {$method = strtoupper($method);$method = $method == 'POST' ? 'POST' : 'GET';//构造传递的参数if (is_array($params)) {$post_params = [];foreach ($params as $k => &$v) {if (is_array($v))$v = implode(',', $v);$post_params[] = $k . '=' . urlencode($v);}$post_string = implode('&', $post_params);} else {$post_string = $params;}$parts = parse_url($url);//构造查询的参数if ($method == 'GET' && $post_string) {$parts['query'] = isset($parts['query']) ? $parts['query'] . '&' . $post_string : $post_string;$post_string = '';}$parts['query'] = isset($parts['query']) && $parts['query'] ? '?' . $parts['query'] : '';//发送socket请求,获得连接句柄$fp = fsockopen($parts['host'], isset($parts['port']) ? $parts['port'] : 80, $errno, $errstr, 3);if (!$fp)return FALSE;//设置超时时间stream_set_timeout($fp, 3);$out = "{$method} {$parts['path']}{$parts['query']} HTTP/1.1\r\n";$out.= "Host: {$parts['host']}\r\n";$out.= "Content-Type: application/x-www-form-urlencoded\r\n";$out.= "Content-Length: " . strlen($post_string) . "\r\n";$out.= "Connection: Close\r\n\r\n";if ($post_string !== '')$out .= $post_string;fwrite($fp, $out);//不用关心服务器返回结果//echo fread($fp, 1024);fclose($fp);return TRUE;}/*** 发送文件到客户端* @param string $file* @param bool $delaftersend* @param bool $exitaftersend*/public static function sendToBrowser($file, $delaftersend = true, $exitaftersend = true) {if (file_exists($file) && is_readable($file)) {header('Content-Description: File Transfer');header('Content-Type: application/octet-stream');header('Content-Disposition: attachment;filename = ' . basename($file));header('Content-Transfer-Encoding: binary');header('Expires: 0');header('Cache-Control: must-revalidate, post-check = 0, pre-check = 0');header('Pragma: public');header('Content-Length: ' . filesize($file));ob_clean();flush();readfile($file);if ($delaftersend) {unlink($file);}if ($exitaftersend) {exit;}}}}
相关文章:
thinkphp中对请求封装
请求的封装 //调用 $res Http::post($this->baseUrl . $url,$params,[CURLOPT_HTTPHEADER > [Content-Type: application/json,Content-Length: . strlen($params),],]);<?php namespace fast; /*** 字符串类*/ class Http {/*** 发送一个POST请求*/public static …...
leetcode hot100【LeetCode 215.数组中的第K个最大元素】java实现
LeetCode 215.数组中的第K个最大元素 题目描述 给定一个整数数组 nums 和一个整数 k,请返回数组中第 k 个最大的元素。 请注意,要求排名是从大到小的,因此第 k 个最大元素是排序后的第 k 个元素。你需要设计一个高效的算法来解决这个问题。…...
簡單易懂:如何在Windows系統中修改IP地址?
無論是為了連接到一個新的網路,還是為了解決網路連接問題,修改IP地址都是一個常見的操作。本文將詳細介紹如何在Windows系統中修改IP地址,包括靜態IP地址的設置和動態IP地址的獲取。 IP地址是什麼? IP地址是互聯網協議地址的簡稱…...
Python中的23种设计模式:详细分类与总结
设计模式是解决特定问题的通用方法,分为创建型模式、结构型模式和行为型模式三大类。以下是对每种模式的详细介绍,包括其核心思想、应用场景和优缺点。 一、创建型模式(Creational Patterns) 创建型模式关注对象的创建࿰…...
日历使用及汉化——fullcalendar前端
官网 FullCalendar - JavaScript Event Calendar 引入项目 <link hrefhttps://cdnjs.cloudflare.com/ajax/libs/fullcalendar/5.10.1/main.min.css relstylesheet /><script srchttps://cdnjs.cloudflare.com/ajax/libs/fullcalendar/5.10.1/main.min.js></sc…...
视频截断,使用 FFmpeg
使用 FFmpeg 截取视频并去掉 5 分 49 秒后的内容,可以使用以下命令: ffmpeg -i input.mp4 -t 00:05:49 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 192k output.mp4-i input.mp4: 指定输入视频文件 input.mp4。 -t 00:05:49&#x…...
使用系统内NCCL环境重新编译Pytorch
intro: 费了老大劲,来重新编译pytorch,中间报了无数错误。原生的编译好的pytorch是直接用的其自带NCCL库,并且从外部是不能进行插桩的,因为根本找不到libnccl.so文件。下面记录下重新编译pytorch的过程。指定USE_SYSTEM_NCCL1。这…...
1. Klipper从安装到运行
本文记录Klipper固件从安装,配置到运行的详细过程 Klipper是3D打印机固件之一,它通常运行在linux系统(常使用Debian,其它的linux版本也可以)上,因此需要一个能运行Linux系统的硬件,比如电脑&am…...
docker 卸载与安装
卸载 查询之前安装的docker, 没有查到则不用卸载删除 yum list installed | grep docker 卸载安装包 yum remove docker-* -y 删除镜像、容器、默认挂载卷 rm -rf /var/lib/docker 安装 -ce 安装稳定版本 -y 当安装过程提示选择全部为 "yes" yum install d…...
跨部门文件共享安全:平衡协作与风险的关键策略
在现代企业中,跨部门协作已成为推动业务发展的关键因素。然而,随着信息的自由流动和共享,文件安全风险也随之增加。如何在促进跨部门协作的同时,确保文件共享的安全性,成为了一个亟待解决的问题。 一、明确文件分类与…...
基于单片机的智慧小区人脸识别门禁系统
本设计基于单片机的智慧小区人脸识别门禁系统。由STM32F103C8T6单片机核心板、显示模块、摄像头模块、舵机模块、按键模块和电源模块组成。可以通过摄像头模块对进入人员人脸数据进行采集,识别成功后,舵机模块动作,模拟门禁打开,门…...
【es6】原生js在页面上画矩形及删除的实现方法
画一个矩形,可以选中高亮,删除自己效果的实现,后期会丰富下细节,拖动及拖动调整矩形大小 实现效果 代码实现 class Draw {constructor() {this.x 0this.y 0this.disX 0this.disY 0this.startX 0this.startY 0this.mouseDo…...
【git实践】分享一个适用于敏捷开发的分支管理策略
文章目录 1. 背景2. 分支管理实践2.1. 敏捷开发中分支管理面临的问题2.2. 分支管理策略2.3. 还需要注意的一些问题 3.总结 1. 背景 在实际的开发工作中,我们往往会面临多任务并行研发,多个环境管理的情况,这种情况下,一个合适的分…...
Redis与MySQL如何保证数据一致性
Redis与MySQL如何保证数据一致性 简单来说 该场景主要发生在读写并发进行时,才会发生数据不一致。 主要流程就是要么先操作缓存,要么先操作Redis,操作也分修改和删除。 一般修改要执行一系列业务代码,所以一般直接删除成本较低…...
基于微信小程序的教室预约系统+LW示例参考
1.项目介绍 功能模块:管理员(学生管理、教师管理、申请管理、设备管理、报修管理等)、普通用户/学生(注册登录、申请预约、退订、报修等)技术选型:SSM、JSP、uniapp等测试环境:idea2024&#x…...
Linux 安装 Git 服务器
一、安装 Git 1. 在 CentOS/RHEL 中使用以下命令: sudo yum update -y # 或者 sudo dnf update -y (在较新的系统中) sudo yum install git -y验证安装:git --version 2. 配置 Git 用户 git config --global user.name "Your Name" git co…...
总结:Yarn资源管理
一、介绍 本文梳理下Yarn的资源分配计算逻辑。 二、配置 - 资源限制 1、配置NodeManager可分配的资源池的总量 <property><name>yarn.nodemanager.resource.memory-mb</name><value>4096</value> </property> 作用对象:节点管理器(No…...
Python学习34天
import random class Game: peo0 rob0 # # def __init__(self,peo,rob): # self.peopeo # self.robrob def Play(self): """ 石头剪刀布游戏,0代表石头,1代见到,2代表石头 …...
深入浅出 WebSocket:构建实时数据大屏的高级实践
简介 请参考下方,学习入门操作 基于 Flask 和 Socket.IO 的 WebSocket 实时数据更新实现 在当今数字化时代,实时性是衡量互联网应用的重要指标之一。无论是股票交易、在线游戏,还是实时监控大屏,WebSocket 已成为实现高效、双向…...
三开关VUE组件
一、使用效果 <template><QqThreeSwitch v-model"value" /><!-- <SqThreeSwitch v-model"value" :options"[test1, test2, test3]"><template #left-action><div style"display: flex"><IconMoon…...
SpringCloud+SpringCloudAlibaba学习笔记
SpringCloud 服务注册中心 eureka ap 高可用 分布式容错 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency><groupId…...
牛客小白月赛105(A~E)
文章目录 A lz的吃饭问题思路code B lz的数字问题思路code C lz的蛋挞问题思路code D lz的染色问题思路code E lz的括号问题思路code 总结 牛客小白月赛105 A lz的吃饭问题 思路 签到题,比较大小即可 code void solve(){int a,b,c,d;cin >> a >> b…...
OSPF协议整理
OSPF(Open Shortest Path First)即开放式最短路径优先协议,是一种广泛应用于大型网络中的链路状态路由协议。 OSPF 的基本概念 OSPF 是基于链路状态算法的内部网关协议(IGP),用于在一个自治系统ÿ…...
Java中的多线程
文章目录 Java中的多线程一、引言二、多线程的创建和启动1、继承Thread类2、实现Runnable接口 三、线程的常用方法1、currentThread()和getName()2、sleep()和yield()3、join() 四、线程优先级五、使用示例六、总结 Java中的多线程 一、引言 在Java中,多线程编程是…...
什么是聚簇索引、非聚簇索引、回表查询
其实聚集索引也叫聚簇索引,二级索引也叫非聚簇索引,大家不要认为这是不同的两个知识点。 定义 先看一下数据库的索引介绍。 聚簇索引 1. 如果存在主键(一般都存在),主键索引就是聚簇索引。 2. 如果不存在,…...
探索 Spring 框架核心组件:构建强大 Java 应用的基石
Spring框架作为Java企业级开发的首选框架之一,其强大的功能和灵活的架构深受开发者喜爱。Spring框架的核心组件共同构建了一个高效、可扩展的应用程序开发平台。本文将深入探讨Spring框架的核心组件,揭示它们如何在Spring框架中发挥关键作用。 一、Bean…...
Android 13 Aosp 默认允许应用动态权限
图库 frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java 修改 public void grantDefaultPermissions(int userId) {DelayingPackageManagerCache pm new DelayingPackageManagerCache();grantPermissionsToSysCompon…...
【C++知识总结1】c++第一篇,简单了解一下命名空间是什么
一、C的由来 C语言是一种结构化和模块化的编程语言,它对于处理较小规模的程序非常适用。然而,当面临需要高度抽象和建模的复杂问题,以及规模较大的程序时,C语言就显得不那么合适了。为了应对这种挑战,并在解决软件危机…...
从0开始深度学习(32)——循环神经网络的从零开始实现
本章将从零开始,基于循环神经网络实现字符级语言模型(不是单词级) 首先我们把从0开始深度学习(30)——语言模型和数据集中的load_corpus_time_machine()函数进行引用,用于导入数据: train_iter…...
GitLab使用操作v1.0
1.前置条件 Gitlab 项目地址:http://******/req Gitlab账户信息:例如 001/******自己的分支名称:例如 001-master(注:master只有项目创建者有权限更新,我们只能更新自己分支,然后创建合并请求&…...
vs做的网站如何使用/优化提升
我们来了解一下MySQL的基本特性:1.内部构件和可移植性使用C和C编写用众多不同的编译器进行了测试能够工作在众多不同的平台上。请参见2.1.1 “MySQL支持的操作系统”。使用GNU Automake、Autoconf和Libtool进行移植。提供了用于C、C、Eiffel、Java、Perl、PHP、Pyth…...
做网站简单吗/全网营销老婆第一人
首先我们看下表设计: 我们现在要实现的功能是 加入购物车逻辑,其实加入购物车这种可以在本地实现的,不用请求服务器,但是考虑商品的时效性,用接口来做体验可能要好一些 我们来分析下购物车的操作体验: 回去…...
常见的网站结构有/交换链接的其它叫法是
又到周五了,时间过得溜溜快啊。这一周在Joans的帮助下,开始学习MVC3。经过四天的查看资料,对MVC3有了简单的认识。学习MVC3涉及的知识包括:C#,Razor,HTML,CCS,JavaScript,…...
响应式网站设计的要求/小红书网络营销策划方案
文章目录1. Mybatis概述1.1 简介1.2 如何获得Mybatis1.3 持久化1.4 持久层1.5 为什么需要Mybatis1.6 Mybatis开发工作流程2 第一个Mybatis程序2.1 搭建环境2.2 创建一个模块2.3 编写代码2.4 测试本文章涉及环境版本: mysql 5.7Mybatis 3.5.xMaven 3.6.xJDK 1.8 项目…...
石家庄做网站比较好的公司/软文网站名称
这篇文章主要介绍了Python二次规划和线性规划使用实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 对于二次规划(quadratic programming)和线性规划(Linear Programming&a…...
政府网站建设工作 主要职责/郑州网络营销公司
对于Vue.js来说,如果你想要快速开始,那么只需要在你的html中引入一个<script>标签,加上CDN的地址即可。但是,这并不算是一个完整的vue实际应用。在实际应用中,我们必须要一系列的工具,包括࿱…...