2012-11-30 1 views
2

Je souhaite ajouter une liste de contrôle d'accès à un objet Google Storage à l'aide de l'API Json d'appengine. J'ai essayé le code suivant, mais je reçois une réponse 400 sans détails. Je n'utilise pas les bibliothèques client-java, cependant je suis prêt à essayer. Ci-dessous mon code:Définir la liste de contrôle d'accès pour l'objet de stockage Google avec JSON Api dans Appengine

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

    } 
} 

La réponse que je reçois est 400, mais les détails ne sont pas utiles à tous.

"erreur": { "erreurs": [ { "domaine": "global", "raison": "nécessaire", "message": "Obligatoire" } ], "code": 400, "message": "Obligatoire" }}

+0

Essayez de changer les rôles en rôle dans request.put ("roles", "READER") – fejta

Répondre

4

Je pense qu'il ya un petit bug ou deux dans votre code. Dans ce cas particulier, il semble que vous envoyez des rôles lorsque l'API JSON attend un rôle. Une chose que je trouve utile pour le débogage est de comparer ce que mon code envoie sur le réseau avec la requête HTTP que génère le Google APIs explorer.

  1. Accédez à https://developers.google.com/storage/docs/json_api/v1/objectAccessControls/insert
  2. Allumez le bouton Authorize requests using OAuth 2.0.
  3. Définissez les champs bucket, object, entity et role.
  4. Cliquez sur Exécuter.

Vous devriez voir la requête HTTP résultante et la réponse.

Demande:

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" 
} 

Réponse:

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]" 
} 

Maintenant, assurez-vous que la demande que vous envoyez sur le fil semble le même que celui-ci.

+0

right on. c'était tout ce que c'était. Merci – Patrick

Questions connexes