2

appengine の Json API を使用して、ACL を Google Storage オブジェクトに追加したいと考えています。次のコードを試しましたが、詳細のない 400 応答が返されます。私は java-client-libraries を使用していませんが、試してみたいと思っています。以下は私のコードです:

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 ですが、詳細はまったく役に立ちません。

"error": { "errors": [ { "domain": "global", "reason": "required", "message": "Required" } ], "code": 400, "message": "Required" } }

4

1 に答える 1

4

コードに小さなバグが 1 つか 2 つあると思います。この特定のインスタンスでは、JSON API がロールを期待しているときにロールを送信しているように見えます。

デバッグに役立つと思うことの 1 つは、コードがネットワーク経由で送信するものと、 Google API エクスプローラーが生成するHTTP リクエストを比較することです。

  1. https://developers.google.com/storage/docs/json_api/v1/objectAccessControls/insertに移動します
  2. Authorize requests using OAuth 2.0ボタンをオンにします。
  3. bucketobjectentityおよびroleフィールドを設定します。
  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": "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"
}

ここで、ネットワーク経由で送信するリクエストがこれと同じであることを確認してください。

于 2012-11-30T02:25:22.117 に答える