2013-12-10 74 views
4

我試圖使用類似to this post which describes doing a PUT/POST for RESTful API的模式,但是用於GET。如何用AFNetworking-2.0做一個JSON編碼的GET請求?

我的原始代碼看起來幾乎相同,除了我使用了GET:關鍵字。我很快發現,不是發送JSON正文,而是通過url對參數進行編碼。這在AFJSONSerializer類的文檔中沒有提及。您必須轉到超類文檔(AFHTTPSerializer)並通讀其屬性,您會在其中找到the one about HTTPMethodsEncodingParametersInURI。默認情況下,該組用HEAD,GET和DELETE填充。那麼對於這些​​類型的請求,JSON序列化器顯然會回覆到其父類的行爲?

所以我總結了以下代碼:

AFHTTPSessionManager* manager = [AFHTTPSessionManager manager]; 
manager.securityPolicy.allowInvalidCertificates = YES; 
manager.requestSerializer = [AFJSONRequestSerializer serializer]; 
manager.requestSerializer.HTTPMethodsEncodingParametersInURI = [NSSet set]; 
[manager.requestSerializer setAuthorizationHeaderFieldWithUsername: currentUser() password: currentPassword()]; 
[manager 
    GET: @"https://172.16.214.214:44321/trees" 
    parameters: [NSDictionary dictionary] 
    success:^(NSURLSessionDataTask* task, id responseObject){ 
     NSLog(@"Response: %@", responseObject);} 
    failure:^(NSURLSessionDataTask* task, NSError* error){ 
     NSLog(@"Error: %@", error);}]; 

,設置HTTPMethodsEncodingParametersInURI = [NSSet set]行的目的是,讓我得到JSON編碼參數,如我想的太。不幸的是,我什麼也看不到在服務器上時,我用這個,讓我在錯誤控制檯如下:

2013-12-10 10:11:14.149 myValve[957:60b] Error: Error Domain=NSURLErrorDomain Code=-1005 "The 
network connection was lost." UserInfo=0x17e5d4b0 
{NSErrorFailingURLStringKey=https://172.16.214.214:44321/trees, 
NSErrorFailingURLKey=https://172.16.214.214:44321/trees, NSLocalizedDescription=The network 
connection was lost., NSUnderlyingError=0x17e53240 "The network connection was lost."} 

我是什麼人仍下落不明?

+0

我希望這實際上是一個答案@Rob。該鏈接有助於明確爲什麼框架可能不支持它。謝謝。 –

+0

我已經發布它作爲答案。我只是不想讓我看到別人的優秀答案。同樣,我總是猶豫發佈一個可以被解讀爲「不這樣做」的答案。大聲笑。 – Rob

回答

2

這裏背後AFNetworking的行爲的理由可能是在堆棧溢出的問題,HTTP GET with request body最簡潔的解釋。其中一個答案是quotes Ray Fielding

......換言之,任何HTTP請求消息都被允許包含消息體,因此必須解析消息。但是,GET的服務器語義受到限制,因此主體(如果有)對請求沒有語義含義。解析的要求與方法語義的要求是分開的。

所以,是的,你可以發送一個GET的身體,不,這樣做是沒有用的。

HTTP/1.1 spec定義GET到「檢索的任何信息(以一個實體的形式)由Request-URI中識別」,不考慮信息被包括在所述請求的主體。所以在技術上GET要求使用該機構可能不會被禁止,但充其量,它是非標準的。 AFNetworking選擇不支持它並不令人感到意外。

因此,您可能不希望將JSON放入正文以獲得GET請求。通常會將這些參數添加到URL中。如果您想在請求的主體中發送JSON,請執行POST

0

聽起來像它無法連接到服務器,你有嘗試在iOS之外撥打電話嗎?

僅供參考我常做這樣的JSON請求:

NSURL *url = @"https://172.16.214.214:44321/trees"; 
NSData* data = [NSData dataWithContentsOfURL: url]; 
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; 
+0

是的,一個簡單的捲曲查詢工作正常。 –