2015-09-25 34 views
-1

我怎樣才能URLEncode a NSDictionary所以我可以發送它跨越AFNetworking編碼NSDictionary發送AFNetworking

的代碼如下:

NSMutableDictionary *rus = [[NSMutableDictionary alloc] init]; 
[rus setValue:@"1211" forKey:@"id"]; 
[rus setValue:@"33" forKey:@"man"]; 

我怎麼編碼這個NSDictionary,所以我可以在AFNetworking發呢?

+0

看看這個[問題](http://stackoverflow.com/questions/8356842/how-to-use-nsjsonserialization),序列化到一個'NSData *'對象中,傳入'AFHTTPRequestOperation'的responseSerializer。認爲你需要詳細瞭解如何使用AFNetworking。 – t0mm13b

+0

我不明白那個代碼。你能不能詳述一下 – Illep

+0

1.把你的'NSMutableDictionary'。 2.使用'dataWithJSONObject:options:error:'方法。 3.利潤(當時你將有一個NSData對象) –

回答

0

取決於你如何想發送您的數據:@ 「應用程序/ JSON」在這種情況下,你可以使用

1)[NSJSONSerialization dataWithJSONObject:參數選項:self.writingOptions錯誤:錯誤]

2)@「application/x-www-form-urlencoded」在這種情況下,您基本上要創建字符串:?id = 1211 & man = 33 from your dictionary rus。

下面是一些代碼,可能不是最有效的利用你的想法:

NSString *temp; 
    int i=0; 

    for(NSString *key in options.params.allKeys) 
    { 
     NSString *value = [options.params objectForKey:key]; 
     [parameters setObject:value forKey:key]; 

     if(i==0) 
     { 
      temp = [NSString stringWithFormat:@"?%@=%@", key,value]; 
     } 
     else 
     { 
      temp = [NSString stringWithFormat:@"%@&%@=%@", temp, key, value]; 
     } 
    } 

注:可能會或可能不會與你有關的,但我的兩分錢:

我使用AFHTTPSessionManager,它處理所有的細節,包括URL編碼,所以我只是通過所需的字典:

NSMutableDictionary *rus = [[NSMutableDictionary alloc] init]; 
    [rus setValue:@"1211" forKey:@"id"]; 
    [rus setValue:@"33" forKey:@"man"]; 

    [self POST:@"/api/place/nearbysearch" parameters:rus success:^(NSURLSessionDataTask *task, id responseObject) { 
      NSLog(@"nearbyPlaces: success"); 
      [self fetchedPlacesData:responseObject block:block]; 
      if(task != nil && task.originalRequest != nil) 
      { 
       NSString *url = [task.originalRequest.URL absoluteString]; 
       [self saveNearbySearchEvent:url params:params]; 
      } 
     } failure:^(NSURLSessionDataTask *task, NSError *error) { 
      NSLog(@"nearbyPlaces: error: %@", error); 
      block(self, nil, error); 
     }]; 

AFHTTPSe ssionManager封裝了許多包括序列化數據的功能:AFURLRequestSerialization,可以是JSON或HTTP請求。如果你什麼AFHTTPSessionManager實際上不會在這裏感興趣的一些細節:

A)的HTTP請求 下面是AFURLRequestSerialization.m代碼:

- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request 
           withParameters:(id)parameters 
             error:(NSError *__autoreleasing *)error 
{ 
    NSParameterAssert(request); 

    NSMutableURLRequest *mutableRequest = [request mutableCopy]; 

    [self.HTTPRequestHeaders enumerateKeysAndObjectsUsingBlock:^(id field, id value, BOOL * __unused stop) { 
     if (![request valueForHTTPHeaderField:field]) { 
      [mutableRequest setValue:value forHTTPHeaderField:field]; 
     } 
    }]; 

    if (parameters) { 
     NSString *query = nil; 
     if (self.queryStringSerialization) { 
      NSError *serializationError; 
      query = self.queryStringSerialization(request, parameters, &serializationError); 

      if (serializationError) { 
       if (error) { 
        *error = serializationError; 
       } 

       return nil; 
      } 
     } else { 
      switch (self.queryStringSerializationStyle) { 
       case AFHTTPRequestQueryStringDefaultStyle: 
        query = AFQueryStringFromParametersWithEncoding(parameters, self.stringEncoding); 
        break; 
      } 
     } 

     if ([self.HTTPMethodsEncodingParametersInURI containsObject:[[request HTTPMethod] uppercaseString]]) { 
      mutableRequest.URL = [NSURL URLWithString:[[mutableRequest.URL absoluteString] stringByAppendingFormat:mutableRequest.URL.query ? @"&%@" : @"?%@", query]]; 
     } else { 
      if (![mutableRequest valueForHTTPHeaderField:@"Content-Type"]) { 
       [mutableRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
      } 
      [mutableRequest setHTTPBody:[query dataUsingEncoding:self.stringEncoding]]; 
     } 
    } 

    return mutableRequest; 
} 

B)JSON

- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request 
           withParameters:(id)parameters 
             error:(NSError *__autoreleasing *)error 
{ 
    NSParameterAssert(request); 

    if ([self.HTTPMethodsEncodingParametersInURI containsObject:[[request HTTPMethod] uppercaseString]]) { 
     return [super requestBySerializingRequest:request withParameters:parameters error:error]; 
    } 

    NSMutableURLRequest *mutableRequest = [request mutableCopy]; 

    [self.HTTPRequestHeaders enumerateKeysAndObjectsUsingBlock:^(id field, id value, BOOL * __unused stop) { 
     if (![request valueForHTTPHeaderField:field]) { 
      [mutableRequest setValue:value forHTTPHeaderField:field]; 
     } 
    }]; 

    if (parameters) { 
     if (![mutableRequest valueForHTTPHeaderField:@"Content-Type"]) { 
      [mutableRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
     } 

     [mutableRequest setHTTPBody:[NSJSONSerialization dataWithJSONObject:parameters options:self.writingOptions error:error]]; 
    } 

    return mutableRequest; 
} 
0
NSMutableDictionary *rus = [[NSMutableDictionary alloc] init]; 
[rus setValue:@"1211" forKey:@"id"]; 
[rus setValue:@"33" forKey:@"man"]; 

如果您正在與服務器交換JSON數據:

NSError *error = nil; 
NSData *aRequestData = [NSJSONSerialization dataWithJSONObject:rus options:NSJSONWritingPrettyPrinted error:&error]; 

if (!error) { 
    [urlRequest setHTTPBody:aRequestData]; 
} 

如果你與你的服務器交換數據PLIST:

[self stringByAppendingQueryParameters:rus appendQuestionMark:NO]; 

- (NSString *)stringByAppendingQueryParameters:(NSDictionary *)iParameters appendQuestionMark:(BOOL)iAppendQuestionMark { 
    BOOL aAppendAmpersand = YES; 
    NSMutableString *aWorking = [NSMutableString stringWithString:self]; 

    if (iAppendQuestionMark) { 
     NSRange aQueryBeginning = [self rangeOfString:@"?"]; 
     if (aQueryBeginning.location == NSNotFound) { 
      [aWorking appendString:@"?"]; 
      aAppendAmpersand = NO; 
     } 
    } else { 
     aAppendAmpersand = NO; 
    } 

    for (id aKey in iParameters) { 
     id aValue = [iParameters valueForKey:aKey]; 
     NSString *aKeyStr = [self convertObjectToURLEncodedValue:aKey]; 

    if (aAppendAmpersand) { 
     [aWorking appendString:@"&"]; 
    } else { 
     aAppendAmpersand = YES; 
    } 

    if ([aValue isKindOfClass:[NSArray class]]) { 
     NSArray *aSubParamaters = (NSArray *)aValue; 
     BOOL aFirstTime = YES; 
     for (id aSubValue in aSubParamaters) { 
      NSString *aValueString = [self convertObjectToURLEncodedValue:aSubValue]; 

      if (!aFirstTime) { 
       [aWorking appendString:@"&"];     
      } 
      [aWorking appendString:aKeyStr]; 
      [aWorking appendString:@"="]; 
      [aWorking appendString:aValueString]; 

      aFirstTime = NO; 
     } 

    } else { 
     NSString *aValueString = [self convertObjectToURLEncodedValue:aValue]; 
     [aWorking appendString:aKeyStr]; 
     [aWorking appendString:@"="]; 
     [aWorking appendString:aValueString];   
    } 

} 

return [NSString stringWithString:aWorking];   
} 


- (NSString *)convertObjectToURLEncodedValue:(id)iObject { 
    NSString *anIntermediate = nil; 

    if ([iObject isKindOfClass:[NSString class]]) { 
     anIntermediate = iObject; 
    } else if ([iObject respondsToSelector:@selector(stringValue)]) { 
     anIntermediate = [iObject stringValue]; 
    } else { 
     anIntermediate = [iObject description]; 
    } 

    NSString *anEncodingString = (__bridge_transfer NSString *)(CFURLCreateStringByAddingPercentEscapes(
                        NULL, 
                        (__bridge CFStringRef)anIntermediate, 
                        NULL, 
                        (CFStringRef)@"!*'();:@&=+$,/?%#[]", 
                        kCFStringEncodingUTF8)); 
    return anEncodingString; 
}