Google app engine 在Appengine中使用JSON Api为Google存储对象设置ACL

Google app engine 在Appengine中使用JSON Api为Google存储对象设置ACL,google-app-engine,google-cloud-storage,Google App Engine,Google Cloud Storage,我想使用appengine的Json API向Google存储对象添加ACL。我已经尝试了以下代码,但是我得到了400的响应,没有任何细节。我不使用java客户机库,但是我愿意尝试。下面是我的代码: public static void updateACL(String bucket, String object, List<String> emails) { try { ArrayList scopes = new ArrayList();

我想使用appengine的Json API向Google存储对象添加ACL。我已经尝试了以下代码,但是我得到了400的响应,没有任何细节。我不使用java客户机库,但是我愿意尝试。下面是我的代码:

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());

    }
}
publicstaticvoidupdateacl(字符串存储桶、字符串对象、,
列出电子邮件){
试一试{
ArrayList范围=新的ArrayList();
作用域。添加(“https://www.googleapis.com/auth/devstorage.full_control");
AppIdentityService appIdentity=AppIdentityService工厂
.getAppIdentityService();
AppIdentityService.GetAccessTokenResult accessToken=appIdentity
.getAccessToken(作用域);
//令牌断言由报告的标识
//appIdentity.getServiceAccountName()
logger.log(Level.WARNING,“bucket:+bucket+”对象:+object+”电子邮件:+emails.get(0));
JSONObject请求=新建JSONObject();
请求.put(“实体”,“用户-”+电子邮件.get(0));
请求。放置(“角色”、“读者”);
URL=新URL(“https://www.googleapis.com/storage/v1beta1/b/"
+bucket+“/o/”+object+“/acl?key=“+API_key”);
HttpURLConnection连接=(HttpURLConnection)url
.openConnection();
connection.setDoOutput(真);
connection.setRequestMethod(“POST”);
addRequestProperty(“内容类型”、“应用程序/json”);
addRequestProperty(“授权”、“OAuth”
+getAccessToken());
字符串urlParameters=“bucket=“+bucket+”&object=“+object;
OutputStreamWriter writer=新的OutputStreamWriter(
connection.getOutputStream());
请求。写(作者);
writer.close();
logger.log(Level.WARNING,connection.getResponseMessage());
logger.log(级别:警告,
valueOf(connection.getResponseCode());
if(connection.getResponseCode()==HttpURLConnection.HTTP\u确定){
//注意:应检查内容编码。
//JSONTokener响应_令牌=新
//JSONTokener(connection.getInputStream());
//JSONObject response=新的JSONObject(response_标记);
//return(String)response.get(“id”);
返回;
}否则{
扫描器;
s=新扫描仪(connection.getErrorStream());
s、 使用分隔符(\\Z”);
字符串响应=s.next();
s、 close();
引发新异常(connection.getResponseCode()+“”+connection.getResponseMessage()+
反应);
}
}捕获(例外e){
logger.log(Level.WARNING,“异常:+e.getMessage());
}
}
我得到的答复是400分,但细节毫无帮助

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


我怀疑你的代码中有一两个小错误。在这个特定的实例中,当JSON api需要角色时,您似乎正在发送角色

我发现对调试有帮助的一件事是比较我的代码通过线路发送的内容与生成的HTTP请求

  • 导航到
  • 使用OAuth 2.0打开
    授权请求按钮
  • 设置
    bucket
    对象
    实体
    角色
    字段
  • 单击执行
  • 您应该看到生成的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": "user-person@example.com",
     "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/user-person@example.com",
     "selfLink": "https://www.googleapis.com/storage/v1beta1/b/bucket/o/obj/acl/user-person@example.com",
     "bucket": "bucket",
     "object": "obj",
     "entity": "user-person@example.com",
     "role": "READER",
     "email": "person@example.com"
    }
    

    现在,请确保您通过网络发送的请求与此请求相同。

    我怀疑您的代码中有一两个小错误。在这个特定的实例中,当JSON api需要角色时,您似乎正在发送角色

    我发现对调试有帮助的一件事是比较我的代码通过线路发送的内容与生成的HTTP请求

  • 导航到
  • 使用OAuth 2.0打开
    授权请求按钮
  • 设置
    bucket
    对象
    实体
    角色
    字段
  • 单击执行
  • 您应该看到生成的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": "user-person@example.com",
     "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/user-person@example.com",
     "selfLink": "https://www.googleapis.com/storage/v1beta1/b/bucket/o/obj/acl/user-person@example.com",
     "bucket": "bucket",
     "object": "obj",
     "entity": "user-person@example.com",
     "role": "READER",
     "email": "person@example.com"
    }
    

    现在,请确保通过网络发送的请求与此请求相同。

    尝试将角色更改为请求中的角色。put(“角色”、“读者”)尝试将角色更改为请求中的角色。put(“角色”、“读者”)