php curl post请求超过1024字节解决方法

在yii2框架中使用CURL,报错了,错误如下:

string(1570) "

错误

您所请求的网址(URL)无法获取

当尝试进行以下请求时:

POST /api/?do=weixinclient&handle=client HTTP/1.1

Host: ghedu.taisha.org

User-Agent: Yii2-Curl-Agent

Accept: */*

Content-Length: 1096

Content-Type: application/x-www-form-urlencoded

Expect: 100-continue

发生了下列的错误:

Invalid Request

无效的请求

Some aspect of the HTTP Request is invalid. Possible problems:

HTTP 请求的某些方面是无效的。可能是下列问题:

Missing or unknown request method

缺少请求方式或未知的请求方式

Missing URL

缺少网址

Missing HTTP Identifier (HTTP/1.0)

缺少 HTTP 标识(HTTP/1.0)

Request is too large

请求命令过长

Content-Length missing for POST or PUT requests

POST 或 PUT 请求缺少内容长度

Illegal character in hostname; underscores are not allowed

主机名称中包含不合法的字符;下划线是不允许的。

本缓存服务器管理员:webmaster.

后来发现是post提交数据时,数据大于1024字节,解决方法如下:

基础知识背景:

“Expect: 100-continue”的来龙去脉:

HTTP/1.1 协议里设计 100 (Continue) HTTP 状态码的的目的是,在客户端发送 Request Message 之前,HTTP/1.1 协议允许客户端先判定服务器是否愿意接受客户端发来的消息主体(基于 Request Headers)。

即, Client 和 Server 在 Post (较大)数据之前,允许双方“握手”,如果匹配上了,Client 才开始发送(较大)数据。

这么做的原因是,如果客户端直接发送请求数据,但是服务器又将该请求拒绝的话,这种行为将带来很大的资源开销。

libcurl 发送大于1024字节数据时启用“Expect:100-continue‘特性:

在使用 curl 做 POST 的时候,当要 POST 的数据大于1024字节的时候,curl 并不会直接就发起 POST 请求,而是会分为两步:

1.发送一个请求,包含一个"Expect: 100-continue"头域,询问Server是否愿意接收数据;

2.接收到Server返回的100-continue 应答以后,才把数据 POST 给Server;

PHP Curl-library 可以主动封禁此特性:

PHP curl 遵从 libcurl 的特性。由于不是所有 web servers 都支持这个特性,所以会产生各种各样的错误。如果你遇到了,可以用下面的命令封禁”Expect”头域:

        //添加如下head头就可传输大于1024字节请求

        curl_setopt($ch, CURLOPT_HTTPHEADER,array('Expect:'));

?>

你可能感兴趣的:(php curl post请求超过1024字节解决方法)