2012-05-25 3 views
0

Я ищу, чтобы отправить NSDictionary до сервера, на котором запущен Django, и я предпочел бы, если бы мне пришлось немного или совсем не писать запись кодера/парсера.Есть ли быстрый способ POST NSDictionary на сервер Python/Django?

Есть ли простой способ выполнить эту задачу?

ответ

0

IOS не имеет поддержки, чтобы сделать это как однострочника, но вы можете сделать это:

@interface NSString (URLEncoding) 

- (NSString *)urlEncodedUTF8String; 

@end 

@interface NSURLRequest (DictionaryPost) 

+ (NSURLRequest *)postRequestWithURL:(NSURL *)url 
          parameters:(NSDictionary *)parameters; 

@end 

@implementation NSString (URLEncoding) 

- (NSString *)urlEncodedUTF8String { 
    return (id)CFURLCreateStringByAddingPercentEscapes(0, (CFStringRef)self, 0, 
    (CFStringRef)@";/?:@&=$+{}<>,", kCFStringEncodingUTF8); 
} 

@end 

@implementation NSURLRequest (DictionaryPost) 

+ (NSURLRequest *)postRequestWithURL:(NSURL *)url 
          parameters:(NSDictionary *)parameters { 

    NSMutableString *body = [NSMutableString string]; 

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
    [request setHTTPMethod:@"POST"]; 
    [request addValue:@"application/x-www-form-urlencoded" 
      forHTTPHeaderField:@"Content-Type"]; 

    for (NSString *key in parameters) { 
    NSString *val = [parameters objectForKey:key]; 
    if ([body length]) 
     [body appendString:@"&"]; 
    [body appendFormat:@"%@=%@", [[key description] urlEncodedUTF8String], 
           [[val description] urlEncodedUTF8String]]; 
    } 
    [request setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]]; 
    return request; 
} 

@end 

Тогда это так же просто, как:

NSURL *url = [NSURL URLWithString:@"http://posttestserver.com/post.php"]; 
NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys: 
    [NSNumber numberWithInt:42], @"number", 
    @"apple", @"brand", nil]; 
NSURLRequest *request = [NSURLRequest postRequestWithURL:url parameters:params]; 
[NSURLConnection sendAsynchronousRequest:request queue:nil completionHandler:nil]; 

Пожалуйста, обратите внимание, что в этом Например, мы не заботимся об ответе. Если вы заботитесь об этом, поставьте блок, чтобы вы могли с ним что-то сделать.

+0

Поддерживает ли это комплексные объекты? Словарь с и множество словарей? – mwoods79

+0

Теперь вы можете использовать метод «stringByRemovingPercentEncoding» NSString вместо расширения категории NSString в этом ответе. (iOS 7.0+) – Salx

1

iOS 5 поддерживает его в каркасе. Посмотрите на NSJSONSerialization. Вот пример кода для сообщения. Создание объекта запроса было опущено в приведенном ниже коде.

NSDictionary *postDict = [NSDictionary dictionaryWithObjectsAndKeys:[NSDictionary dictionaryWithObjectsAndKeys:API_KEY, @"apiKey", userName, @"loginUserName", hashPassword, @"hashPassword", nil], @"loginReq", nil]; 

[request setHTTPMethod:@"POST"]; 
[request setValue:@"application/json" forHTTPHeaderField:@"content-type"]; 
NSError *error = nil; 
[request setHTTPBody:[NSJSONSerialization dataWithJSONObject:postDict options:0 error:&error]]; 
Смежные вопросы