2012-07-16 145 views
4

首先,我意識到對於PUT請求,請求參數應該在請求體中傳遞。但是,我正在使用一個API(我只是在使用,而不是開發),它希望將請求參數作爲查詢字符串附加到PUT請求中。AFNetworking:追加參數作爲PUT請求的查詢字符串

我正在使用AFHTTPClient的子類。對於我指的特定PUT請求,我使用了getPath:參數:success:failure:

我到目前爲止找到的解決方案是手動構建路徑變量以包含我想要傳遞的參數。當然,這是不理想的,我想知道是否有另一個不容易出錯的選項。

總之,是否有一種方法可以使用AFHTTPClient(的一個子類)和附加(和編碼)的傳遞參數作爲查詢字符串(就像GET請求一樣)發送PUT請求?

回答

4

AFHTTPClient.m中的getPath:parameters:success:failure方法調用requestWithMethod:path:parameters。在後一種方法中,將根據特定值檢查HTTP方法,以決定如何將參數附加到請求中。如您所見,默認情況下,只有在GET,HEAD或DELETE請求的情況下,這些參數才應附加到URL中。因爲你需要他們在PUT請求的情況下要附加到URL也修改requestWithMethod:路徑:參數是這樣的:

- (NSMutableURLRequest *)requestWithMethod:(NSString *)method 
             path:(NSString *)path 
           parameters:(NSDictionary *)parameters 
{ 
    NSURL *url = [NSURL URLWithString:path relativeToURL:self.baseURL]; 
    NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] initWithURL:url] autorelease]; 
    [request setHTTPMethod:method]; 
    [request setAllHTTPHeaderFields:self.defaultHeaders]; 

    if ([method isEqualToString:@"GET"] || [method isEqualToString:@"HEAD"]) { 
     [request setHTTPShouldUsePipelining:YES]; 
    } 

    if (parameters) {   
     if ([method isEqualToString:@"GET"] || [method isEqualToString:@"HEAD"] || [method isEqualToString:@"DELETE"] || [method isEqualToString:@"PUT"]) { 
      url = [NSURL URLWithString:[[url absoluteString] stringByAppendingFormat:[path rangeOfString:@"?"].location == NSNotFound ? @"?%@" : @"&%@", AFQueryStringFromParametersWithEncoding(parameters, self.stringEncoding)]]; 
      [request setURL:url]; 
     } else { 
      NSString *charset = (NSString *)CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(self.stringEncoding)); 
      switch (self.parameterEncoding) { 
       case AFFormURLParameterEncoding:; 
        [request setValue:[NSString stringWithFormat:@"application/x-www-form-urlencoded; charset=%@", charset] forHTTPHeaderField:@"Content-Type"]; 
        [request setHTTPBody:[AFQueryStringFromParametersWithEncoding(parameters, self.stringEncoding) dataUsingEncoding:self.stringEncoding]]; 
        break; 
       case AFJSONParameterEncoding:; 
        [request setValue:[NSString stringWithFormat:@"application/json; charset=%@", charset] forHTTPHeaderField:@"Content-Type"]; 
        [request setHTTPBody:[AFJSONStringFromParameters(parameters) dataUsingEncoding:self.stringEncoding]]; 
        break; 
       case AFPropertyListParameterEncoding:; 
        [request setValue:[NSString stringWithFormat:@"application/x-plist; charset=%@", charset] forHTTPHeaderField:@"Content-Type"]; 
        [request setHTTPBody:[AFPropertyListStringFromParameters(parameters) dataUsingEncoding:self.stringEncoding]]; 
        break; 
      } 
     } 
    } 

    return request; 
} 
1

對於我的API的情況下,改變AFHTTPClient對象的解決了編碼問題:

myAFHTTPClient.parameterEncoding = AFJSONParameterEncoding; 
+0

正如可以從上述(detwelk回答)代碼中看到,AFJSONParemeterEncoding仍然繞過AFQueryStringFromParametersWithEncoding塊並根據需要使用請求體,而不是URL。 – nh32rg 2013-10-25 18:45:13

3

你可以只做datwalk答案中的代碼而不修改底層的AFNetworking代碼。使用AFNetworking創建包括URL參數的路徑:

NSDictionary *mutableParameters = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"csv",@"format", @"0",@"level", @"2013-10-25", @"keydate", nil]; 

NSString *urlPath = [NSString stringWithFormat:@"applications/%@/Planning?%@", name, AFQueryStringFromParametersWithEncoding(mutableParameters, NSUTF8StringEncoding)]; 

NSString *apiFunctionPath = [urlPath stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

[self putPath:apiFunctionPath 
    parameters:nil 
     success:^(AFHTTPRequestOperation *operation, id XML) { 
      NSLog(@"%@",XML); 
     } 
     failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
      NSLog(@"%@",error); 
     }]; 
相關問題