我試圖使用YouTube API及其ClientLogin。這意味着我需要向他們的服務器發出POST請求。如何通過PHP中的HTTPS發出POST請求?
我需要向https://www.google.com/accounts/ClientLogin提出請求的URL。我需要發送的變量是Email
,Passwd
,source
和service
。到現在爲止還挺好。
我發現這個整潔的函數進行POST調用(見下文),但它不使用HTTPS,我認爲我必須使用它。這一切正常,但我認爲我的POST請求正在轉發到HTTPS,因此它不給我適當的回調。當我嘗試var_dump
時,返回的數據網頁將重新加載,我最終在https://www.google.com/accounts/ClientLogin處獲得正確的數據。但我當然需要這些數據作爲數組或字符串。
那麼如何使用HTTPS發出POST請求?
硒我下面的代碼(我發現在Jonas’ Snippet Library):
function post_request($url, $data, $referer='') {
$data = http_build_query($data);
$url = parse_url($url);
$host = $url['host'];
$path = $url['path'];
$fp = fsockopen($host, 80, $errno, $errstr, 30);
if ($fp){
fputs($fp, "POST $path HTTP/1.1\r\n");
fputs($fp, "Host: $host\r\n");
if ($referer != '')
fputs($fp, "Referer: $referer\r\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
fputs($fp, "Content-length: ". strlen($data) ."\r\n");
fputs($fp, "Connection: close\r\n\r\n");
fputs($fp, $data);
$result = '';
while(!feof($fp)) {
$result .= fgets($fp, 128);
}
}
else {
return array(
'status' => 'err',
'error' => "$errstr ($errno)"
);
}
fclose($fp);
$result = explode("\r\n\r\n", $result, 2);
$header = isset($result[0]) ? $result[0] : '';
$content = isset($result[1]) ? $result[1] : '';
return array(
'status' => 'ok',
'header' => $header,
'content' => $content
);
}
這是響應頭:
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Date: Tue, 03 May 2011 12:15:20 GMT
Expires: Tue, 03 May 2011 12:15:20 GMT
Cache-Control: private, max-age=0
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Content-Length: 728
Server: GSE
Connection: close
我回來的內容是某種形式的autosubmitted,我認爲是因爲我使用HTTP而不是HTTPS:
function autoSubmit() {
document.forms["hiddenpost"].submit();
}
Processing...
那麼,我該如何做HTT PS POST請求?
由於octopusgrabbus好心指出的那樣,我需要使用端口443,而不是80所以我改變了這一點,但現在我什麼也沒有回來。從函數返回
的var_dump:
array(3) {
["status"]=>
string(2) "ok"
["header"]=>
string(0) ""
["content"]=>
string(0) ""
}
我沒有得到任何標題和內容沒有回來。哪裏不對?
我改變了端口爲443,我沒有得到任何迴應。任何想法爲什麼? – jamietelin 2011-05-03 12:35:32