由于所有网址处理对象都在标准的Cocoa库中(NSURL、NSMutableURL、NSMutableURLRequest等),我知道我肯定忽略了一种以编程方式编写GET请求的简单方法。
目前我正在手动添加"?“后面跟着用"&“连接的名称和值对,但是我所有的名称和值对都需要手动编码,这样NSMutableURLRequest在尝试连接到URL时就不会完全失败。
这感觉像是我应该能够使用一个预烘焙的API来……有什么现成的方法可以将查询参数的NSDictionary附加到NSURL中吗?有没有其他方法可以解决这个问题?
发布于 2009-04-05 06:44:18
您可以为NSDictionary
创建一个类别来执行此操作--我在Cocoa库中也找不到标准的方法。我使用的代码如下所示:
// file "NSDictionary+UrlEncoding.h"
#import <cocoa/cocoa.h>
@interface NSDictionary (UrlEncoding)
-(NSString*) urlEncodedString;
@end
使用此实现:
// file "NSDictionary+UrlEncoding.m"
#import "NSDictionary+UrlEncoding.h"
// helper function: get the string form of any object
static NSString *toString(id object) {
return [NSString stringWithFormat: @"%@", object];
}
// helper function: get the url encoded string form of any object
static NSString *urlEncode(id object) {
NSString *string = toString(object);
return [string stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
}
@implementation NSDictionary (UrlEncoding)
-(NSString*) urlEncodedString {
NSMutableArray *parts = [NSMutableArray array];
for (id key in self) {
id value = [self objectForKey: key];
NSString *part = [NSString stringWithFormat: @"%@=%@", urlEncode(key), urlEncode(value)];
[parts addObject: part];
}
return [parts componentsJoinedByString: @"&"];
}
@end
我认为代码非常简单,但我将在http://blog.ablepear.com/2008/12/urlencoding-category-for-nsdictionary.html中更详细地讨论它。
发布于 2014-06-30 18:23:01
我重构了AlBeebe并将其转换为ARC答案
- (NSString *)serializeParams:(NSDictionary *)params {
NSMutableArray *pairs = NSMutableArray.array;
for (NSString *key in params.keyEnumerator) {
id value = params[key];
if ([value isKindOfClass:[NSDictionary class]])
for (NSString *subKey in value)
[pairs addObject:[NSString stringWithFormat:@"%@[%@]=%@", key, subKey, [self escapeValueForURLParameter:[value objectForKey:subKey]]]];
else if ([value isKindOfClass:[NSArray class]])
for (NSString *subValue in value)
[pairs addObject:[NSString stringWithFormat:@"%@[]=%@", key, [self escapeValueForURLParameter:subValue]]];
else
[pairs addObject:[NSString stringWithFormat:@"%@=%@", key, [self escapeValueForURLParameter:value]]];
}
return [pairs componentsJoinedByString:@"&"];
}
- (NSString *)escapeValueForURLParameter:(NSString *)valueToEscape {
return (__bridge_transfer NSString *) CFURLCreateStringByAddingPercentEscapes(NULL, (__bridge CFStringRef) valueToEscape,
NULL, (CFStringRef) @"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8);
}
发布于 2014-12-24 16:03:04
如果您已经在使用AFNetworking (我就是这样),那么可以使用它的类AFHTTPRequestSerializer
来创建所需的NSURLRequest
。
[[AFHTTPRequestSerializer serializer] requestWithMethod:@"GET" URLString:@"YOUR_URL" parameters:@{PARAMS} error:nil];
如果您只需要作品的URL,请使用NSURLRequest.URL
。
https://stackoverflow.com/questions/718429
复制相似问题