「再開可能なセッションを開始する」YouTube Data API - 再開可能なアップロードのドキュメントに従おうとすると、parseError が発生します。
取り組み、応答、およびコードの完全なリスト
- Google API を読みました - 「グローバル ドメイン エラー」ページ「parseError API サーバーはリクエスト本文を解析できません。」
- 「YouTube Developers Live: Debugging & Dealing with Errors」を見ましたが、そこに手がかりが残っています
- 同様の質問について「スタックオーバーフロー」を読みましたが、回答が得られないか、回答がまだ明確ではありません
- アップロードしたいテスト youtube アカウントには、動画のある youtube チャンネルがあります
- クライアント PHP アップロード API を試してみましたが、後で再開可能なアップロードではないことがわかりました。
- 再開可能なアップロードの方が良い選択肢だと思ったので、接続が途切れた場合に時間を無駄にしてユーザーを苛立たせることはありません....
- hostgator アカウントから PHP を実行しています
- エラーが発生しなかった場合、「ステップ 2 - 再開可能なセッション URI を保存する」データではなく、通常のスニペットとステータス データが返されることに気付きました。
- データベースから引き出された長寿命のアクセストークンを使用しています...リクエストでは、アクセストークンを保存する前に、YouTubeユーザーがビデオのチャンネルを持っています
- tokeninfo でアクセス トークンを確認しますか?
- 「uploadType」を「uploadtype」に変更すると、「メッセージ」が生成されることに気付きました:「Media type 'application/json; charset=utf-8'」
はサポートされていません。有効なメディア タイプ: [video/*, application/octet-stream]"、このエラーに続いてコンテンツ タイプを "application/octet-stream" に変更すると
、Step ではなく "kind = youtube#video object with json snippet,status"が返されます。 2 - 再開可能なセッション URI を保存するので、「uploadType」と「application/json;」に戻します。charset=utf-8" が同じ解析エラーに直面するようになりました
- ドキュメントで「リクエスト URL のパラメーター値は URL エンコードする必要があります。」urlencode() "Parameter values" を実行すると、urlencode 関数を削除するとエラーまたは parseError が返されます
- 「Host: www.googleapis.com」を「Host: https://www.googleapis.com」に変更しても、「要求された URL /upload/youtube/v3/videos がこのサーバーで見つかりませんでした。それが私たちが知っているすべてです。 ."
- これまでのところ、解析エラーが最も持続しているようです
- urlencode() を rawurlencode() に変更しましたが、まだ解析エラーが発生します
- charset=utf-8;multipart/form-data;application/octet-stream をコンテンツ タイプ ヘッダーに追加しても、解析エラーが発生します
- 文字列のコンテンツ タイプが text/plain であることに気付きました。charset=us-ascii Google サーバーが純粋な application/json を期待しているかどうかわからない
どんな助けでも素晴らしいでしょう…</p>
Array
(
[response] => Array
(
[0] => {
"error": {
"errors": [
{
"domain": "global",
"reason": "parseError",
"message": "Parse Error"
}
],
"code": 400,
"message": "Parse Error"
}
}
)
[headers] => [
"POST \/upload\/youtube\/v3\/videos?uploadType=resumable&part=snippet,status HTTP\/1.1",
"Host: www.googleapis.com",
"Authorization: Bearer ya29.vAAY5n3SJq3uCG7z4tOhehDxYj9Z7mxFENtD5PKF_dJqFlLqwCktRHTrEJkUgY_NrJD3KMetKeBA_w",
"Content-Length: 303",
"Content-Type: application\/json; charset=utf-8",
"X-Upload-Content-Length: 20121",
"X-Upload-Content-Type: video\/*"
]
[curl_resource] => Resource id #18
[video_aray] => {
"snippet": {
"title": "test video",
"description": "testing api",
"tags": [
"any",
"thing"
],
"categoryId": 25
},
"status": {
"privacyStatus": "public",
"embeddable": true,
"license": "youtube"
}
}
[json_requestbody] => {
"snippet": {
"title": "test video",
"description": "testing api",
"tags": [
"any",
"thing"
],
"categoryId": 25
},
"status": {
"privacyStatus": "public",
"embeddable": true,
"license": "youtube"
}
}
[request_url] => https://www.googleapis.com/upload/youtube/v3/videos?uploadType=resumable&part=snippet,status
[content_type_of_request] => text/plain; charset=us-ascii
[0] => text/plain; charset=us-ascii
[1] => text/plain; charset=us-ascii
)
ソース
public function startResumableSession()
{
$videoResource = array( 'snippet'=>array('title'=>"test video",'description'=>"testing api",
'tags'=>array("any","thing"),'categoryId'=>25),
'status'=>array('privacyStatus'=>"public",'embeddable'=>True,'license'=>"youtube"));
$requestBody = json_encode($videoResource,JSON_PRETTY_PRINT);
$headers = array
(
"POST /upload/youtube/v3/videos?uploadType=resumable&part=snippet,status HTTP/1.1",
"Host: www.googleapis.com",
"Authorization: Bearer ya29.vAAY5n3SJq3uCG7z4tOhehDxYj9Z7mxFENtD5PKF_dJqFlLqwCktRHTrEJkUgY_NrJD3KMetKeBA_w",
"Content-Length: ".strlen($requestBody),
"Content-Type: application/json; charset=utf-8",
"X-Upload-Content-Length: 20121",
"X-Upload-Content-Type: video/*"
);
/* Parameter values in the request URL must be URL-encoded. */
$url = "https://www.googleapis.com/upload/youtube/v3/videos?uploadType=resumable&part=snippet,status";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HTTPHEADER,$headers);
curl_setopt($ch, CURLOPT_POSTFIELDS,urlencode($requestBody));
curl_setopt($ch, CURLOPT_RETURNTRANSFER,TRUE);
$result = curl_exec($ch);
$json = json_decode($result);
/* Check request body contenttype */
$finfo = new finfo(FILEINFO_MIME);
$t1= $finfo->buffer($requestBody);
$t2 = $finfo->buffer("test");
$t3 = $finfo->buffer(utf8_encode("test"));
/* debug info */
return array( 'response'=>(array)$result,
'headers'=>json_encode($headers,JSON_PRETTY_PRINT),
'curl_resource'=>$ch,
'video_aray'=>json_encode($videoResource,JSON_PRETTY_PRINT),
'json_requestbody'=>$requestBody,
'request_url'=>$url,
'content_type_of_request'=>$t1,$t2,$t3
);
}