1

尝试遵循“启动可恢复会话”YouTube 数据 API - 可恢复上传文档时遇到 parseError。

工作、响应和代码的完整列表

  1. 我在 Google APIs -“全局域错误”页面上阅读了“parseError API 服务器无法解析请求正文”。
  2. 我看过“YouTube 开发者直播:调试和处理错误”仍然知道线索
  3. 我已经阅读过类似问题的“stack over flow”,但从未得到回答,或者答案仍然不清楚
  4. 我要上传到的测试 youtube 帐户有一个带有视频的 youtube 频道
  5. 我尝试了客户端 PHP 上传 API,但后来发现它不是可恢复的上传。
  6. 我认为可恢复的上传会是一个更好的选择,所以如果连接中断,我不会因为浪费时间而让用户感到沮丧......
  7. 我正在从 hostgator 帐户运行 PHP
  8. 我注意到当我没有收到错误时,它会返回常规代码段和状态数据,而不是“第 2 步 - 保存可恢复会话 URI”数据
  9. 我正在使用从我的数据库中提取的长期访问令牌...在请求中,youtube 用户在我存储访问令牌之前有一个带有视频的频道
  10. 我确实使用 tokeninfo 检查访问令牌?
  11. 我注意到将“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" 现在面临同样的解析错误

  1. 我在文档中注意到“请求 URL 中的参数值必须是 URL 编码的”。当我将 urlencode() “参数值”删除时,它会返回错误或 parseError 删除 urlencode 函数
  2. 即使将“主机:www.googleapis.com”更改为“主机:https ://www.googleapis.com ”也会产生“在此服务器上找不到请求的 URL /upload/youtube/v3/videos。这就是我们所知道的。”
  3. 解析错误似乎是迄今为止最持久的
  4. 我已将 urlencode() 更改为 rawurlencode() 仍然解析错误
  5. 我将 charset=utf-8;multipart/form-data;application/octet-stream 添加到内容类型标头,仍然解析错误
  6. 我注意到字符串上的内容类型是文本/纯文本;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
                        );
    }    
4

1 回答 1

-1

简单的答案是——你做错了。

您不应该在 $headers 中添加“POST”、“Host:”和“Content-Length:”,因为这是由 curl(CURLOPT_URL 和 CURLOPT_POSTFIELDS)生成的。

YouTube API 工作正常。这不是他们的错。

于 2014-12-15T11:15:28.443 回答