This API does not support parsing form-encoded inputになった話

なんか小1時間ぐらい悩んでしまった。

結論

GoogleのAPIから送信する時は「Content-Type: application/json; charset=UTF-8」を付けましょう。

事象

PHPでCURLを使ってGoogleのURL短縮のAPIへのリクエストをしていたのですが、以下のようなエラー

{
  "error": {
    "errors": [
     {
      "domain": "global",
      "reason": "parseError",
      "message": "This API does not support parsing form-encoded input.
     }
   ],
   "code": 400,
   "message": "This API does not support parsing form-encoded input.
  }
}

で、その時にリクエストしていたCURLのロジックはこちら

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $uri);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 証明書の検証を行わない
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); // 証明書の検証を行わない
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($postData));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);  // curl_execの結果を文字列で返す
$response = curl_exec($curl);

なので↓を足したらちゃんと通りました

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $uri);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 証明書の検証を行わない
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); // 証明書の検証を行わない
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($postData));
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charset=UTF-8')); //←☆これ
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);  // curl_execの結果を文字列で返す
$response = curl_exec($curl);

ちゃんとjsonということを明示しないと怒られてしまうそうです。
(デフォルトだとapplication/x-www-form-urlencodedで送信されているそう)

GoogleのAPIを使うときは気を付けましょう。

【広告】

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です