【web开发】php服务端提交post请求

泛型珊瑚
• 阅读 4153

服务端常见的post提交有三种方式,这里主要记录curl方式

1、服务端进行http-post的三种方法

1.1 通过curl函数

function post($url, $post_data = '', $timeout = 5){//curl
    $ch = curl_init();
    curl_setopt ($ch, CURLOPT_URL, $url);
    curl_setopt ($ch, CURLOPT_POST, 1);
    if($post_data != ''){
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    }
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_HEADER, false);
    $file_contents = curl_exec($ch);
    curl_close($ch);
    return $file_contents;
}

1.2 通过Filesystem函数

function post2($url, $data)
{
    $postdata = http_build_query(
        $data
    );
    $opts = array(
        'http' => array(
                  'method'  => 'POST',
                  'header'  => 'Content-type: application/x-www-form-urlencoded',
                  'content' => $postdata
                ),
    );
    $context = stream_context_create($opts);

    $result = file_get_contents($url, false, $context);
 
    return $result;
}

1.3 借助网络函数

fsockopen();
fwrite();
fread();
fclose();

以上三种方法源码参考自:原文

2、我本地构造的curl成功提交post

2.1 curl提交post源码

    /**
     * [sendPostHttp]
     * @param  string  $url     提交地址,[schema://host:port]
     * @param  array   $params  需要通过post提交的数据
     * @param  integer $timeout 连接超时
     * @return mixed            提交状态
     */
    static public function sendPostHttp($url, $params, $timeout = 5)
    {
        // 构造post提交
        $ch = curl_init();
        $option = array(
            CURLOPT_URL         =>      $url,
            CURLOPT_CONNECTTIMEOUT      =>  $timeout,
            CURLOPT_SSL_VERIFYPEER      =>  false,
            CURLOPT_SSL_VERIFYHOST      =>  false,

            CURLOPT_HEADER      =>   false,
            CURLOPT_POST        =>   true,
            CURLOPT_POSTFIELDS  =>   http_build_query($params),
            CURLOPT_RETURNTRANSFER  =>  true,      
        );
        curl_setopt_array($ch, $option);

        // 提交post
        $ret = curl_exec($ch);
        if (false == $ret) {
            echo curl_error($ch);
        }

        curl_close($ch);
        return $ret;
    }

2.2 构造请求中遇到的坑

1、构造过程中参考了php手册中的curl_setopt

【web开发】php服务端提交post请求

所以首次尝试时,CURLOPT_POSTFIELDS的值用了数组:
CURLOPT_POSTFIELDS => $params
结果总是返回错误信息:
Recv failure: Connection was reset
2、为什么会出现这样的错误呢?
我们注意到CURLOPT_POSTFIELDS说明中如果value是数组,
Content-Type头将会被设置成multipart/form-data
猜测原因就出在CURLOPT_POSTFIELDS的值上边,所以将其传值改为CURLOPT_POSTFIELDS => http_build_query($params),果然success!
参考:http_build_query构造请求字符串

2.3 未解的疑问

但是,为什么CURLOPT_POSTFIELDS会产生这样影响呢?查了一下multipart/form-data,但是没有得到具体原因。参见multipart/form-data请求分析

推测可能是对方服务器不接受这样的Content-Type吧?
或者对multipart/form-data的不兼容?

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Souleigh ✨ Souleigh ✨
3年前
从0实现一遍axios,再也不怕写请求
axios请求方法主要有get,post,put,patch,deleteget获取数据post提交数据(表单提交文件上传)put更新数据(将所有数据均推放到服务端)patch更新数据(只将修改的数据推送到后端)delete
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
Stella981 Stella981
3年前
PHP导入导出EXCELl,CSV
PHP导入导出Excel,CSVHTML<formaction"{:U('Admin/Unit/importcsv')}"method"post"name"myform"id"myform"enctype"multipart/formdata"<input
Wesley13 Wesley13
3年前
PHP 表单
1、一个简单的HTML表单POSt方法包含两个输入字段和一个提交按钮<html<body<formaction"welcome.php"method"post"Name:<inputtype"text"name"name"<brEmail:<inputty
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这