在yii2框架中使用CURL,報錯了针饥,錯誤如下:
string(1570) "
錯誤
您所請求的網(wǎng)址(URL)無法獲取
當(dāng)嘗試進(jìn)行以下請求時:
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
發(fā)生了下列的錯誤:
Invalid Request
無效的請求
Some aspect of the HTTP Request is invalid. Possible problems:
HTTP 請求的某些方面是無效的∠坠可能是下列問題:
Missing or unknown request method
缺少請求方式或未知的請求方式
Missing URL
缺少網(wǎng)址
Missing HTTP Identifier (HTTP/1.0)
缺少 HTTP 標(biāo)識(HTTP/1.0)
Request is too large
請求命令過長
Content-Length missing for POST or PUT requests
POST 或 PUT 請求缺少內(nèi)容長度
Illegal character in hostname; underscores are not allowed
主機(jī)名稱中包含不合法的字符甥材;下劃線是不允許的顷窒。
本緩存服務(wù)器管理員:webmaster.
后來發(fā)現(xiàn)是post提交數(shù)據(jù)時,數(shù)據(jù)大于1024字節(jié)作谭,解決方法如下:
基礎(chǔ)知識背景:
“Expect: 100-continue”的來龍去脈:
HTTP/1.1 協(xié)議里設(shè)計 100 (Continue) HTTP 狀態(tài)碼的的目的是稽物,在客戶端發(fā)送 Request Message 之前,HTTP/1.1 協(xié)議允許客戶端先判定服務(wù)器是否愿意接受客戶端發(fā)來的消息主體(基于 Request Headers)折欠。
即贝或, Client 和 Server 在 Post (較大)數(shù)據(jù)之前,允許雙方“握手”锐秦,如果匹配上了咪奖,Client 才開始發(fā)送(較大)數(shù)據(jù)。
這么做的原因是酱床,如果客戶端直接發(fā)送請求數(shù)據(jù)羊赵,但是服務(wù)器又將該請求拒絕的話,這種行為將帶來很大的資源開銷扇谣。
libcurl 發(fā)送大于1024字節(jié)數(shù)據(jù)時啟用“Expect:100-continue‘特性:
在使用 curl 做 POST 的時候昧捷,當(dāng)要 POST 的數(shù)據(jù)大于1024字節(jié)的時候,curl 并不會直接就發(fā)起 POST 請求罐寨,而是會分為兩步:
1.發(fā)送一個請求靡挥,包含一個"Expect: 100-continue"頭域,詢問Server是否愿意接收數(shù)據(jù)衩茸;
2.接收到Server返回的100-continue 應(yīng)答以后芹血,才把數(shù)據(jù) POST 給Server;
PHP Curl-library 可以主動封禁此特性:
PHP curl 遵從 libcurl 的特性楞慈。由于不是所有 web servers 都支持這個特性幔烛,所以會產(chǎn)生各種各樣的錯誤。如果你遇到了囊蓝,可以用下面的命令封禁”Expect”頭域:
<?php
? ? ? ? //添加如下head頭就可傳輸大于1024字節(jié)請求
? ? ? ? curl_setopt($ch, CURLOPT_HTTPHEADER,array('Expect:'));
?>