2015-09-25 50 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; 
}