2012-11-30 43 views
2

我想使用appengine中的Json API将ACL添加到Google Storage对象。我尝试了下面的代码,但是我得到了一个没有任何细节的400响应。我没有使用java-client-libraries,但是我愿意尝试。以下是我的代码:在Appengine中使用JSON API为Google存储对象设置ACL

public static void updateACL(String bucket, String object, 
     List<String> emails) { 

    try { 
     ArrayList scopes = new ArrayList(); 
     scopes.add("https://www.googleapis.com/auth/devstorage.full_control"); 
     AppIdentityService appIdentity = AppIdentityServiceFactory 
       .getAppIdentityService(); 
     AppIdentityService.GetAccessTokenResult accessToken = appIdentity 
       .getAccessToken(scopes); 
     // The token asserts the identity reported by 
     // appIdentity.getServiceAccountName() 
     logger.log(Level.WARNING, "bucket: "+bucket+" object: "+object+ " email: "+emails.get(0)); 
     JSONObject request = new JSONObject(); 
     request.put("entity", "user-" + emails.get(0)); 
     request.put("roles", "READER"); 

     URL url = new URL("https://www.googleapis.com/storage/v1beta1/b/" 
       + bucket + "/o/"+object+"/acl?key=" + API_KEY); 
     HttpURLConnection connection = (HttpURLConnection) url 
       .openConnection(); 
     connection.setDoOutput(true); 
     connection.setRequestMethod("POST"); 
     connection.addRequestProperty("Content-Type", "application/json"); 
     connection.addRequestProperty("Authorization", "OAuth " 
       + accessToken.getAccessToken()); 
     String urlParameters = "bucket=" + bucket + "&object=" + object; 
     OutputStreamWriter writer = new OutputStreamWriter(
       connection.getOutputStream()); 
     request.write(writer); 
     writer.close(); 
     logger.log(Level.WARNING, connection.getResponseMessage()); 
     logger.log(Level.WARNING, 
       String.valueOf(connection.getResponseCode())); 
     if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) { 
      // Note: Should check the content-encoding. 
      // JSONTokener response_tokens = new 
      // JSONTokener(connection.getInputStream()); 
      // JSONObject response = new JSONObject(response_tokens); 
      // return (String) response.get("id"); 
      return; 
     } else { 

     Scanner s; 
     s = new Scanner(connection.getErrorStream()); 
     s.useDelimiter("\\Z"); 
     String response = s.next(); 
     s.close(); 
      throw new Exception(connection.getResponseCode()+" "+connection.getResponseMessage()+ 
        response); 
     } 
    } catch (Exception e) { 

     logger.log(Level.WARNING, "exception: "+e.getMessage()); 

    } 
} 

我得到的答案是400,但细节没有任何帮助。

“错误”:{ “错误”:[ { “结构域”: “全局”, “原因”: “需要”, “消息”: “必需” } ] “代码”:400, “消息”: “必需” }}

+0

尝试将角色更改为request.put中的角色(“角色”,“读者”) – fejta

回答

4

我怀疑有一个微小的错误或两个在你的代码。在这个特定的实例中,当JSON API期望角色时,它看起来像你正在发送角色。

我发现调试有用的一件事是比较我的代码通过网线发送的Google APIs explorer生成的HTTP请求。

  1. 导航到https://developers.google.com/storage/docs/json_api/v1/objectAccessControls/insert
  2. 接通Authorize requests using OAuth 2.0按钮。
  3. 设置bucket,object,entityrole字段。
  4. 单击执行。

您应该看到生成的HTTP请求和响应。

请求:

POST https://www.googleapis.com/storage/v1beta1/b/bucket/o/obj/acl?key={YOUR_API_KEY} 

Content-Type: application/json 
Authorization: Bearer ya29.1111111111111111111111111111111111-aaaaaaaaaaaaa 
X-JavaScript-User-Agent: Google APIs Explorer 

{ 
"entity": "[email protected]", 
"role": "READER" 
} 

响应:

200 OK 

- Hide headers - 

cache-control: no-cache, no-store, max-age=0, must-revalidate 
content-type: application/json; charset=UTF-8 
date: Fri, 30 Nov 2012 02:16:57 GMT 
etag: "fP_WVz7o95h5w16zKezUFJzMmHg/6CyL8wOk_60IJhaxNewPk1fHpQo" 
expires: Fri, 01 Jan 1990 00:00:00 GMT 
server: GSE 

{ 

"kind": "storage#objectAccessControl", 
"id": "bucket/obj/[email protected]", 
"selfLink": "https://www.googleapis.com/storage/v1beta1/b/bucket/o/obj/acl/[email protected]", 
"bucket": "bucket", 
"object": "obj", 
"entity": "[email protected]", 
"role": "READER", 
"email": "[email protected]" 
} 

现在确保您发送过线的要求看起来是一样的,因为这一个。

+0

正确。就是这样。谢谢 – Patrick

相关问题