在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”头域:
<?php
//添加如下head头就可传输大于1024字节请求
curl_setopt($ch, CURLOPT_HTTPHEADER,array('Expect:'));
?>
网友评论