2012-02-02 32 views
1

感謝您花時間閱讀本文。我查看了Stack Overflow並沒有看到類似的問題,但是如果我錯過了一個,我表示歉意。使用REST發佈對象數組的典型技術

因此,我構建了一個RESTful API以及一個用戶界面,該用戶界面是所述REST API的(第一個)使用者。

我需要創建一個對象。該對象的創建需要大量的配置。

我瞭解我需要使用的動詞(POST - 讓我們不要爭論這一點)和我需要的URL路徑。我的問題是關於如何配置參數。讓我給你一個簡單的配置對象JSON格式,以便不可知:

{ 
    name: "foo", 
    barid:1, 
    features:[ 
     { 
     id:1, 
     config: { 
      foo:bar, 
      fubar:baz 
     } 
     }, 
     { 
     id:2, 
     config: { 
      foo:bar, 
      fubar:baz 
     } 
     },... 
    ] 
    } 

所以我不知道這是什麼...什麼是張貼特徵參數的正確方法是什麼?我應該只使用一個JSON字符串「功能」並在服務器端反序列化它?是否有一些約定可以在RESTful POST中構建嵌套對象數組?其他開發商將不得不消耗這一點,我當然不希望人們不得不手工建造什麼jQuery的做了與我的JSON對象,它看起來像:

features[0][featureid]:2 
features[0][configuration][min]:-64 
features[0][configuration][max]:50 
features[0][include]:true 
features[1][featureid]:3 
features[1][configuration][min]:0 
features[1][configuration][max]:80.5 
features[1][include]:true 

我的Grails應用程序不喜歡那非常多:)

再次感謝您的時間。

回答

2

Grails可以接受像features[0].featured=2&features[0].configuration.min=-64這樣的參數,但是您必須在實際映射之前準備空結構和要素數組。這將是:

import org.apache.commons.collections.ListUtils 
import org.apache.commons.collections.Factory 

class DataCommand { 

    String name 

    List features = = ListUtils.lazyList([], { 
     new FeatureCommand(
      configuration: new ConfigurationCommand() 
    ) 
    } as Factory) 

} 

+

class FeatureCommand { 
    int featured 
    ConfigurationCommand configuration 
} 

class ConfigurationCommand { 
    int min 
    int max 
} 

lazyList創造需求列表元素。如果您確切知道功能的數量 - 您可以使用lazyList手動填充它。

順便說一句,它也是一個很好的方法來POST/PUT實體JSON在身體到服務器,而不是請求參數。例如,它是BackboneJS的默認方式。因此,您將能夠自行解析傳入的JSON,映射到相同的命令(需要很少的配置)。

+0

嘿Splix - 我不知道關於Grails的事情,我很欣賞這些。我將在未來使用它(可能會重構另一個應用程序來使用它),但最終我真的在問一個關於REST的問題,而不是關於Grails。由於其他人將會使用我的RESTful API,我希望按照最少突擊的原則進行操作,並確保我的API以他們期望的方式使用,而不管語言和平臺如何。 – JSager 2012-02-03 14:59:06

+0

您可以使用標準JSON(作爲POST body),這很常見,而且似乎大多數語言都可以使用JSON。如果你喜歡查詢參數 - 我沒有看到任何'features [0] .featured = 2'格式的問題,它也很常見(而且這是我第一次看到'features [0] [featured]:2') – 2012-02-03 15:11:26

+0

謝謝。現在我要沿着JSON字符串路線走 – JSager 2012-02-03 19:27:11