Здесь много хороших ответов.Вот что я делаю: я построил класс параметров, который заботится о синтаксисе сопряжения, а также о кодировке URL.
#import "NSString+URLEncoding.h"
@interface UrlParameter ()
@property (strong, nonatomic) NSString *pair;
@property (strong, nonatomic) NSString *encodedPair;
@end
@implementation UrlParameter
@synthesize pair = _pair;
@synthesize encodedPair = _encodedPair;
+ (UrlParameter *)withName:(NSString *)name value:(NSString *)value {
UrlParameter *answer = [[UrlParameter alloc] init];
answer.pair = [NSString stringWithFormat:@"%@=%@", name, value];
answer.encodedPair = [NSString stringWithFormat:@"%@=%@", [name urlEncode], [value urlEncode]];
return answer; // autorelease if non-ARC
}
@end
Это основывается на методе категории NSString, который я использовал в паре постов.(Также ARC-ready):
@implementation NSString (URLEncoding)
- (NSString *)urlEncodeUsingEncoding:(CFStringEncoding)encoding {
return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(__bridge CFStringRef)self,
NULL,
CFSTR("!*'();:@&=+$,/?%#[]"),
encoding));
}
- (NSString *)urlEncode {
return [self urlEncodeUsingEncoding:kCFStringEncodingUTF8];
}
@end
Я также делю URL-запрос на подклассы и даю ему изменяемый массив параметров, затем, перед его запуском, он делает следующее:
// in the interface
@property (strong, nonatomic) NSMutableArray *parameters;
- (void)prepareParameters {
NSMutableString *encodedParameterPairs = [NSMutableString stringWithCapacity:256];
int position = 1;
for (UrlParameter *requestParameter in self.parameters) {
[encodedParameterPairs appendString:[requestParameter encodedPair]];
if (position < [self.parameters count]) [encodedParameterPairs appendString:@"&"];
position++;
}
if ([[self HTTPMethod] isEqualToString:@"GET"] || [[self HTTPMethod] isEqualToString:@"DELETE"]) {
NSString *urlString = [NSString stringWithFormat:@"%@?%@", [self URLString], encodedParameterPairs];
[self setURL:[NSURL URLWithString:urlString]];
} else {
// POST, PUT
NSData *postData = [encodedParameterPairs dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
[self setHTTPBody:postData];
[self setValue:[NSString stringWithFormat:@"%d", [postData length]] forHTTPHeaderField:@"Content-Length"];
[self setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
}
}