在yii2框架中使用CURL,報(bào)錯(cuò)了,錯(cuò)誤如下:
string(1570) "
錯(cuò)誤
您所請(qǐng)求的網(wǎng)址(URL)無法獲取
當(dāng)嘗試進(jìn)行以下請(qǐng)求時(shí):
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ā)生了下列的錯(cuò)誤:
Invalid Request
無效的請(qǐng)求
Some aspect of the HTTP Request is invalid. Possible problems:
HTTP 請(qǐng)求的某些方面是無效的??赡苁窍铝袉栴}:
Missing or unknown request method
缺少請(qǐng)求方式或未知的請(qǐng)求方式
Missing URL
缺少網(wǎng)址
Missing HTTP Identifier (HTTP/1.0)
缺少 HTTP 標(biāo)識(shí)(HTTP/1.0)
Request is too large
請(qǐng)求命令過長(zhǎng)
Content-Length missing for POST or PUT requests
POST 或 PUT 請(qǐng)求缺少內(nèi)容長(zhǎng)度
Illegal character in hostname; underscores are not allowed
主機(jī)名稱中包含不合法的字符;下劃線是不允許的。
本緩存服務(wù)器管理員:webmaster.
后來發(fā)現(xiàn)是post提交數(shù)據(jù)時(shí),數(shù)據(jù)大于1024字節(jié),解決方法如下:
基礎(chǔ)知識(shí)背景:
“Expect: 100-continue”的來龍去脈:
HTTP/1.1 協(xié)議里設(shè)計(jì) 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ā)送請(qǐng)求數(shù)據(jù),但是服務(wù)器又將該請(qǐng)求拒絕的話,這種行為將帶來很大的資源開銷。
libcurl 發(fā)送大于1024字節(jié)數(shù)據(jù)時(shí)啟用“Expect:100-continue‘特性:
在使用 curl 做 POST 的時(shí)候,當(dāng)要 POST 的數(shù)據(jù)大于1024字節(jié)的時(shí)候,curl 并不會(huì)直接就發(fā)起 POST 請(qǐng)求,而是會(huì)分為兩步:
1.發(fā)送一個(gè)請(qǐng)求,包含一個(gè)"Expect: 100-continue"頭域,詢問Server是否愿意接收數(shù)據(jù);
2.接收到Server返回的100-continue 應(yīng)答以后,才把數(shù)據(jù) POST 給Server;
PHP Curl-library 可以主動(dòng)封禁此特性:
PHP curl 遵從 libcurl 的特性。由于不是所有 web servers 都支持這個(gè)特性,所以會(huì)產(chǎn)生各種各樣的錯(cuò)誤。如果你遇到了,可以用下面的命令封禁”Expect”頭域:
<?php
? ? ? ? //添加如下head頭就可傳輸大于1024字節(jié)請(qǐng)求
? ? ? ? curl_setopt($ch, CURLOPT_HTTPHEADER,array('Expect:'));
?>