资讯专栏INFORMATION COLUMN

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

AndroidTraveler / 537人阅读

摘要:参见请求分析推测可能是对方服务器不接受这样的吧或者对的不兼容

服务端常见的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

所以首次尝试时,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的不兼容?

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21927.html

相关文章

  • HTTP contentType

    摘要:规范把请求分为三个部分状态行请求头消息主体。消息主体最后以标示结束。格式支持比键值对复杂得多的结构化数据,这一点也很有用。例如下面这段代码最终发送的请求是这种方案,可以方便的提交复杂的结构化数据,特别适合的接口。 Content-Type HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体。类...

    beita 评论0 收藏0
  • ajax概述

    摘要:换一台电脑就要重新安装。并且还需要适配不同的系统。提交大小几乎没有限制。即协议主要由请求和响应组成。相反则为同步按照程序的顺序,依次往下执行,必须等上一程序执行完成之后才能执行下一程序,阻碍程序的执行。 Ajax 服务器 类型 按照服务类型:文件服务器,数据库服务器,邮件服务器,Web服务器 按照操作系统:Linux服务器,Windows服务器 按照应用软件:Apache服务器,Ng...

    Achilles 评论0 收藏0
  • JS基础篇--JS之表单提交时编码类型enctype详解

    摘要:格式支持比键值对复杂得多的结构化数据,这一点也很有用。例如下面这段代码最终发送的请求是这种方案,可以方便的提交复杂的结构化数据,特别适合的接口。 简介 form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x-www-form-urlencoded。 ...

    ad6623 评论0 收藏0
  • JavaScript 进阶知识 - Ajax篇

    摘要:注意事项以下版本要设置默认编码,,否则程序可能无法正确显示中文。组成部分协议是对请求和响应的报文内容进行了约束和规范。请求报文请求是由客户端发起,其规范格式为请求行请求头请求主体。 showImg(https://segmentfault.com/img/remote/1460000013696283?w=1920&h=1080); Ajax 前言 前面我们已经学习了js基础知识和一些...

    Dongjie_Liu 评论0 收藏0

发表评论

0条评论

AndroidTraveler

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<