2012-02-22 55 views
8

在GET方法上使用loadObjectAtResourcePath,不包括我的參數在請求上。iOS:RestKit loadObject&發送參數

例如,如果我送:

[RKObjectManager objectManagerWithBaseURL:@"http://something/ws"]; 
    [[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/res" delegate:self block:^(RKObjectLoader *loader) { 
     NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 
           @"val", @"param1", 
           nil]; 
     loader.params = [RKParams paramsWithDictionary:dict]; 
    }]; 

最終的URL請求中不包括 「參數1 = VAL?」 的一部分 - 爲什麼?

回答

15

更新個月後

真正的答案是,loader.params是創建一個HTTP BODY,因此它適用於POST, PUT, DELETE等,但不GET其中PARAMS追加到URL。

因此,下面得到的答案仍然工作,如果你面臨着同樣的問題爲GET,但如果你發出GET請求,它主要是利用附加PARAMS到查詢字符串的方法。

總結兩者之間的差異。在HTTP正文

發送PARAMS(即POST, UPDATE, DELETE

// Convert a NS Dictionary into Params 
RKParams *params = [RKParams paramsWithDictionary:optionValues]; 

// I use sendObject to skip the router. Otherwise it's normally postObject 
[[RKObjectManager sharedManager] sendObject:yourObject toResourcePath: yourResourcePath usingBlock:^(RKObjectLoader *loader) { 
    loader.method = RKRequestMethodPOST; 
    loader.delegate = delegate; 
    loader.params = params; // This sets params in the POST body and discards your yourObject mapping 

} ]; 

買者自負(上面)

中塊設置PARAMS破壞,你可能在yourObject已設置的任何映射,這種打破了使用對象映射的目的。如果你真的想用這種方法在你的Post中附加額外的參數而不是在對象中,Sebastian loader.params - Extra params有一個修正。

params中發送作爲查詢字符串(即GET

// Make a NS dictionary and use stringByAppendingQueryParameters 
NSDictionary *shopParams = [NSDictionary dictionaryWithKeysAndObjects: 
           @"limit",@"20", 
           @"location",@"latitude,longitude", 
           nil]; 

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:[@"/api/v1/shops.json" stringByAppendingQueryParameters:shopParams] delegate:objectDelegate]; 

答案的其餘部分是僅供參考,我是囤積。


老回答

我使用RestKit爲我的項目,面臨着同樣的問題。

我認爲RKParams主要用於做POST請求。我不能完全破譯你的代碼,因爲1)我不知道loader的聲明? 2)RKParams不可與Object Manager一起使用?

我做到了。

裝載機法在應用程序委託

NSDictionary *shopParams = [NSDictionary dictionaryWithKeysAndObjects:@"limit",@"30", nil]; 

[[RKClient sharedClient] get:@"/api/v1/shops.json" queryParams:shopParams delegate:self]; 

代表

- (void)requestDidStartLoad:(RKRequest *)request { 
    NSLog(@"RK Request description: %@",[request description]); 
} 

輸出RK Request description: <RKRequest: 0x7993db0>和軌道記錄說{"limit"=>"30"}

從Xcode中的自動完成,你可以看到get請求甚至沒有使用RKParams。只是一個NSDict。 POST請求使用它。

我的目標是將一個查詢字符串,即?location=singapore&etcetc附加到Rails中的API方法中。爲此,RK附帶了一個名爲appendQueryParamsRK docs linkNSString插件,您可以使用它追加查詢參數。

如果你的目標是POST圖片等,你可以按照上述思路使用RKClient

更新:

如果你只是想附加參數對象管理

NSDictionary *shopParams = [NSDictionary dictionaryWithKeysAndObjects: 
           @"limit",@"20", 
           @"location",@"latitude,longitude", 
           nil]; 

這是過時的,標記爲棄用。


[[RKObjectManager sharedManager] loadObjectsAtResourcePath:[@"/api/v1/shops.json" appendQueryParams:shopParams] delegate:self]; 

使用這個代替:

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:[@"/api/v1/shops.json stringByAppendingQueryParameters:shopParams] delegate:yourLoaderDelegate]; 

Rails的日誌{"location"=>"latitude,longitude", "limit"=>"20"}

希望我的回答我沒有做任何錯誤陳述。

提到這個問題RestKit GET query parameters

+1

最終這也是我所做的。然而,我確實想使用對象管理器來使用RestKit的映射功能。 – 2012-02-26 20:38:53

+0

@daemonsy感謝這一堆。一段時間以來,我一直在嘲笑我的頭。 – drewish 2012-07-18 15:28:29

+0

@drewish謝謝。每當有人發現這個有用的時候,我會盡量更新它,以便更徹底。 – 2012-07-24 06:05:53