2014-09-28 85 views
1

我正在使用JSON API Java庫將對象上傳到Google Cloud Storage。我已經想出瞭如何使用角色讀取器添加實體allUsers以獲得公共訪問權限,但是我試圖添加到ObjectAccessControl列表的任何其他實體/角色條目產生一些類似的錯誤,如Google Cloud Storage設置權限提供錯誤的請求錯誤Java JSON API

com.google.api。 client.googleapis.json.GoogleJsonResponseException:400錯誤的請求

"code" : 400, 
"errors" : [ { 
    "domain" : "global", 
    "message" : "Invalid Value", 
    "reason" : "invalid" 
    } 

...每個ACL條目我有,除了ALLUSERS READER其中一個似乎工作

我不知道它在抱怨這裏。我試圖重現我在開發人員控制檯中看到的默認權限,即,當我沒有在元數據上指定任何ACL時。 業主,業主專案編號, 編輯-專案編號主人, 觀衆,讀者專案編號, 和用戶ID所有者(我猜這是服務帳戶ID)

我添加這些到ACL列表以同樣的方式作爲allUsers實體。我已經搜索了幾個小時,試圖找到一些文件或類似的問題,但只發現一個關於所有用戶。我試過轉義這些ID,認爲JSON庫可能不會這樣做,但得到相同的錯誤。

這裏是我的相關的Java代碼:

// Set permissions and content type on StorageObject metadata  
StorageObject objectMetadata = new StorageObject(); 

// set access control 
List<ObjectAccessControl> acl = Lists.newArrayList(); 
acl.add(new ObjectAccessControl().setEntity("allUsers").setRole("READER")); 
// this one allows upload to work without error if it is the only access specified, 
// but prevents me from modifying publicly available status or editing permissions 
// via the developers console (I think this is to be expected) 

// attempt to replicating bucket defaults... 
// adding any of these will cause the error 
acl.add(new ObjectAccessControl().setEntity("owners-projectId").setRole("OWNER")); 
acl.add(new ObjectAccessControl().setEntityId("editors-projectId").setRole("OWNER")); 
acl.add(new ObjectAccessControl().setEntityId("viewers-projectId").setRole("READER")); 

objectMetadata.setAcl(acl); 

其中專案編號是從開發者控制檯站點複製我的項目ID。

+0

能否請您提供您的代碼? – jterrace 2014-09-29 15:31:15

回答

1

終於明白了這一點。

我先是懷疑DEVSTORAGE_READ_WRITE我的存儲範圍是不夠的,並試圖DEVSTORAGE_FULL_CONTROL,但這不是理由。

而且無視我使用setEntityId(...)在原來的職位,雖然這是我也試過無濟於事。

的問題只是在實體說法不正確的語法。你所需要的文檔是這樣的: https://cloud.google.com/storage/docs/json_api/v1/defaultObjectAccessControls

然後你會看到合適的方法看起來是這樣的:

acl.add(new ObjectAccessControl().setEntity("project-owners-projectId").setRole("OWNER")); 

奇怪的是,這並不工作:

acl.add(new ObjectAccessControl().setProjectTeam(new ProjectTeam().setProjectNumber("projectId").setTeam("owners")).setRole("OWNER")); 

我懷疑設置項目團隊實體的方法是Java庫中的一個錯誤,但我不確定。

對於口口聲聲說域全局要求不正確的實體或域全局無效值的錯誤消息,根本就不是非常有啓發性。這種情況下不需要設置域。另請參閱: What domain is Google Cloud Storage expecting in the ACL definitions when inserting an object?

希望這可以幫助別人了!

0

您可以通過使用「predefinedAcl」的代碼如下設置的訪問控制權限。

Storage.Objects。插入insertObject = client.objects()。insert(,,);

insertObject.setPredefinedAcl("publicRead"); 

這將正常工作

相關問題