2011-05-03 68 views
3

我試圖使用YouTube API及其ClientLogin。這意味着我需要向他們的服務器發出POST請求。如何通過PHP中的HTTPS發出POST請求?

我需要向https://www.google.com/accounts/ClientLogin提出請求的URL。我需要發送的變量是Email,Passwd,sourceservice。到現在爲止還挺好。

我發現這個整潔的函數進行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) "" 
} 

我沒有得到任何標題和內容沒有回來。哪裏不對?

回答

6

我認爲你不能直接HTTPS說話,因爲這是HTTP與你正在連接的服務器的公共證書加密。也許你可以在php中使用一些ssl functions。但是,這會花費你一些時間和坦率地說,有更容易的事情。

只需看看cURL(客戶端URL),它支持GET和POST請求,並且還連接到https服務器。

2

您在80端口SSL端口打開您的插座是443

+0

我改變了端口爲443,我沒有得到任何迴應。任何想法爲什麼? – jamietelin 2011-05-03 12:35:32

0

如果這是SSL,則有一個與該Web服務器上存在的安全證書相關的官方計算機名稱。您可能需要使用該正式名稱進行連接。