2011-06-27 40 views
6

我對Iphone使用ASIHttpRequest(v.1.8-95),並希望與一些正文數據一起創建一個同步DELETE請求。我就這樣說:帶身體參數的ASIHttpRequest DELETE方法

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:nsUrl]; 
[request appendPostData:[@"some body params" dataUsingEncoding:NSUTF8StringEncoding]]; 
[request setRequestMethod:@"DELETE"]; 
[request startSynchronous]; 

雖然我是通過

NSLog(@"request: method:%@", request.requestMethod); 

,該方法是正確設置在服務器端收到一個「POST」請求「刪除」 證實在客戶端!

如果我只是省略

[request appendPostData: ..] 

正確DELETE接收服務器端)

那麼,什麼是錯我的要求嗎? 感謝您的任何解決方案。

問候

creator_11

回答

7

搜索的asihttprequest組(http://groups.google.com/group/asihttprequest/search?group=asihttprequest&q=delete&qt_g=Search+this+group)變成了一些相關的職位,包括一個建議的解決方法:

通話buildPostBody您的要求 你填充體內後,但 你設定的請求方法之前。

+0

謝謝你的提示,你也在這個谷歌組發送給我。正如前面提到的那樣,帶有附加「buildPostBody」語句的建議解決方案可以正常工作,並且DELETE請求現在可以成功。謝謝。 –

2

HTTP動詞和用法不能僅僅進行混合和匹配。好的,他們可以,但是你必須更換服務器來支持你的非標準使用。 DELETE should use the URI of the resource被刪除,那就是它。沒有POST參數,沒有附件。

如果真的要與刪除一起發送一些額外的數據,你可以將其設置在請求(addRequestHeader:value:)的頭,而服務器端拉這些信息出來,但要避免,如果你能。原因是,DELETE應該刪除由它的URI引用的「事物」。如果服務器應用程序的業務邏輯表示刪除應該影響其他一些對象(例如級聯刪除),那麼客戶端應用程序就不應該知道這一點。

你可以在執行DELETE時解釋你想要POST的內容,也許我可以提供一個替代解決方案。

+0

如上所述,帶有附加「buildPostBody」語句的解決方案工作正常。我同意,從純粹的REST角度來看,你是對的,應該在URI中指定要刪除的資源。但據我所知,http協議規範。不禁止任何發佈數據和DELETE請求。自我們的服務器應用程序。不依賴於「純粹的」REST,它只需要一些資源說明符作爲現在可以發送它們的發佈數據。不過,我將與負責服務器應用程序的人討論這一點。只是爲了改進設計。謝謝。 C. –