尝试遵循“启动可恢复会话”YouTube 数据 API - 可恢复上传文档时遇到 parseError。
工作、响应和代码的完整列表
- 我在 Google APIs -“全局域错误”页面上阅读了“parseError API 服务器无法解析请求正文”。
- 我看过“YouTube 开发者直播:调试和处理错误”仍然知道线索
- 我已经阅读过类似问题的“stack over flow”,但从未得到回答,或者答案仍然不清楚
- 我要上传到的测试 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”来跟踪此错误将返回“kind = youtube#video
object with json snippet,status”而不是 Step 2 - 保存可恢复的会话 URI,所以我改回“uploadType”和“application/json; charset=utf-8" 现在面临同样的解析错误
- 我在文档中注意到“请求 URL 中的参数值必须是 URL 编码的”。当我将 urlencode() “参数值”删除时,它会返回错误或 parseError 删除 urlencode 函数
- 即使将“主机:www.googleapis.com”更改为“主机:https ://www.googleapis.com ”也会产生“在此服务器上找不到请求的 URL /upload/youtube/v3/videos。这就是我们所知道的。”
- 解析错误似乎是迄今为止最持久的
- 我已将 urlencode() 更改为 rawurlencode() 仍然解析错误
- 我将 charset=utf-8;multipart/form-data;application/octet-stream 添加到内容类型标头,仍然解析错误
- 我注意到字符串上的内容类型是文本/纯文本;charset=us-ascii 不确定谷歌服务器是否需要纯应用程序/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
);
}