2

当我尝试访问与我的应用程序共享的图像的 contentUrl 时,我得到一个状态码 401。

这是返回给我的 contentUrl:

https://www.googleapis.com/mirror/v1/timeline/4ba66392-b8a0-4fa8-9c66-afa483881582/attachments/ps:5874927624199854018?alt=media

这些是标题:

缓存控制→私有,max-age=0

内容编码 →gzip

内容长度 →34

内容类型→文本/html;字符集=UTF-8

日期 →2013 年 5 月 6 日星期一 22:39:28 GMT

到期 →2013 年 5 月 6 日星期一 22:39:28 GMT

服务器→GSE

状态 →401 未授权

版本→HTTP/1.1

www-authenticate →Bearer realm="https://www.google.com/accounts/AuthSubRequest"

x-content-type-options →nosniff

x-frame-options →SAMEORIGIN

x-xss-保护→1;模式=块

这是一个错误吗?当 contentType 让我相信可以访问时,我实际上如何访问 jpeg?

4

2 回答 2

3

附件受 OAuth 2.0 保护的方式与时间线项等其他实体相同。要访问它们,您必须提供有效的 OAuth 访问令牌。

默认情况下,对该 URL 的请求会返回附件元数据。如果您想要字节,则必须media通过添加 GET 参数来指定响应格式alt=media。官方客户端库为此提供了包装器。

参考文档快速入门项目中有多种语言的示例。以下是我从这些来源复制的一些值得注意的内容:

原始 HTTP:

GET /mirror/v1/timeline/{timeline item id}/attachments/{attachment id}?alt=media HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer {auth token}

爪哇:

/**
 * Download a timeline items's attachment.
 * 
 * @param service Authorized Mirror service.
 * @param itemId ID of the timeline item to download the attachment for.
 * @param attachment Attachment to download content for.
 * @return The attachment content on success, {@code null} otherwise.
 */
public static InputStream downloadAttachment(Mirror service, String itemId, 
                                             Attachment attachment) {
  try {
    HttpResponse resp =
        service.getRequestFactory()
            .buildGetRequest(new GenericUrl(attachment.getContentUrl()))
            .execute();
    return resp.getContent();
  } catch (IOException e) {
    // An error occurred.
    e.printStackTrace();
    return null;
  }
}

PHP:

/**
 * Download an attachment's content.
 *
 * @param string $timelineId ID of the timeline item the attachment belongs to.
 * @param Google_Attachment $attachment Attachment's metadata.
 * @return string The attachment's content if successful, null otherwise.
 */
function downloadAttachment($itemId, $attachment) {
  $request = new Google_HttpRequest(
      $attachment->getContentUrl(), 'GET', null, null);
  $httpRequest = Google_Client::$io->authenticatedRequest($request);
  if ($httpRequest->getResponseHttpCode() == 200) {
    return $httpRequest->getResponseBody();
  } else {
    // An error occurred.
    return null;
  }
}

Python:

def download_attachment(service, attachment):
  """Download an attachment's content

  Args:
    service: Authorized Mirror service.
    attachment: Attachment's metadata.
  Returns:
    Attachment's content if successful, None otherwise.
  """
  resp, content = service._http.request(attachment['contentUrl'])
  if resp.status == 200:
    return content
  else:
    print 'An error occurred: %s' % resp
    return None
于 2013-05-06T23:22:51.690 回答
1

如果您查看“访问附件”部分下的https://developers.google.com/glass/timeline ,它会显示

注意:附件内容受 OAuth 2.0 保护,就像对 API 端点的其他调用一样。Google API 客户端库使用媒体下载功能提供对附件二进制内容的访问。

Java 库就是用这个来说明的,其他库也可以使用类似的方法。这是一种不同于https://developers.google.com/glass/v1/reference/timeline/attachments/get中说明的方法

于 2013-05-06T23:29:24.517 回答