簡體   English   中英

Google服務器不支持POST請求

[英]POST Request not supported by Google Server

將請求從服務器發布到google.com時出現以下錯誤:

警告:file_get_contents(http://accounts.google.com):無法打開流:HTTP請求失敗! 第23行的C:\\ ... \\ index.php中不允許HTTP / 1.0 405方法

我的代碼如下:

$postdata = http_build_query(
    array(
        'code'          => '####',
        'client_id'     => '####',
        'client_secret' => '####',
        'grant_type'    => 'authorization_code'
    )
);

$opts = array(
    'http' => array(
        'method'  => 'POST',
        'header'  => 'Content-type: application/x-www-form-urlencoded',
        'content' => $postdata
    )
);

$context = stream_context_create($opts);

$result = file_get_contents('http://accounts.google.com', false, $context);

echo $result;

您選擇的方法是“ PUT”而不是“ POST”。 如果您想以POST形式發送請求,請更改

'方法'=>'PUT'

'方法'=>'開機自檢'

首先,您在這里得到的是響應碼(405),它在錯誤類之內(400到499或也寫為4xx )。

因此,服務器會在協議級別向您報告錯誤。 所使用的協議也被命名為:HTTP,更具體地說是HTTP / 1.0。

RFC1945中概述了包括狀態代碼的HTTP / 1.0:

這里的問題是沒有定義代碼405(作為具體數字)。 因此,文檔會退回到4xx的常規說明中獲取錯誤代碼

RFC2616中概述了HTTP / 1.1:

但是,它具有405錯誤代碼的詳細信息 ,如代碼示例中的響應標頭所示:

// ...
$result = file_get_contents('http://accounts.google.com', false, $context);

var_dump($http_response_header);

輸出:

array(6) {
  [0] => string(31) "HTTP/1.0 405 Method Not Allowed"
  [1] => string(38) "Content-Type: text/html; charset=UTF-8"
  [2] => string(19) "Content-Length: 958"
  [3] => string(35) "Date: Thu, 24 Oct 2013 12:03:09 GMT"
  [4] => string(15) "Server: GFE/2.0"
  [5] => string(27) "Alternate-Protocol: 80:quic"
}

所需的響應列表顯示了另一個協議沖突,因為所需的Allow標頭不是響應的一部分。 它將表明允許哪些方法。

因此,您所能做的就是嘗試使用常見的HTTP方法而不是PUT來工作,您可能正在尋找POST。 讓我們用POST運行示例,但是沒有運氣:

警告:file_get_contents(http://accounts.google.com):無法打開流:HTTP請求失敗! 此URL不支持HTTP / 1.0 405 HTTP方法POST

我建議您與Google(向其發送HTTP請求的在線服務的供應商)聯系,並詢問您需要與之匹配的技術規格。 出於調試目的,我建議您閱讀有關PHP的特殊$http_response_header變量的信息,我有一些示例代碼和說明,以及一些有關使用PHP的HTTP Wrapper處理錯誤的提示:

使用錯誤的URI(這就是為什么您沒有獲得允許的方法標頭的原因)。 通過https://accounts.google.com/o/oauth2/token檢索訪問令牌是必需的。

無關:您的發布數據缺少必需的“ redirect_uri”。

這太晚了,希望對我這樣的人有所幫助。

有兩個問題。 首先,不能使用client_secret生成訪問令牌。 因此,要成功發送請求,必須包含client_secret

其次,谷歌想識別client_id ,因此它也應該是POST參數的一部分。

用於生成訪問令牌的正確參數應類似於

$opts = array(
'http' => array(
    'method'  => 'POST',
    'header'  => 'Content-type: application/x-www-form-urlencoded',
    'content' => $postdata,
    'client_id' => '######################',
    'client_secret' => '##########################'
 )
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM