正确访问图像附件的方法

时间:2013-05-06 22:44:49

标签: google-mirror-api

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

这是contentUrl返回给我的:

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

这些是标题:

  

cache-control→private,max-age = 0

     

content-encoding→gzip

     

content-length→34

     

content-type→text / 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   境界= “https://www.google.com/accounts/AuthSubRequest”

     

x-content-type-options→nosniff

     

x-frame-options→SAMEORIGIN

     

x-xss-protection→1;模式=块

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

2 个答案:

答案 0 :(得分:3)

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

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

reference docsquick start projects中有多种语言的示例。以下是我从这些来源中复制的一些值得注意的内容:

原始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

答案 1 :(得分:1)

如果您查看“访问附件”部分下的https://developers.google.com/glass/timeline,则说明

  

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

使用此库来说明Java库,其他库也可以使用类似的方法。这与https://developers.google.com/glass/v1/reference/timeline/attachments/get

中所示的方法不同