首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在ObjectiveC中从NSDictionary对象创建URL查询参数

在ObjectiveC中从NSDictionary对象创建URL查询参数
EN

Stack Overflow用户
提问于 2009-04-05 05:51:35
回答 8查看 73.9K关注 0票数 90

由于所有网址处理对象都在标准的Cocoa库中(NSURL、NSMutableURL、NSMutableURLRequest等),我知道我肯定忽略了一种以编程方式编写GET请求的简单方法。

目前我正在手动添加"?“后面跟着用"&“连接的名称和值对,但是我所有的名称和值对都需要手动编码,这样NSMutableURLRequest在尝试连接到URL时就不会完全失败。

这感觉像是我应该能够使用一个预烘焙的API来……有什么现成的方法可以将查询参数的NSDictionary附加到NSURL中吗?有没有其他方法可以解决这个问题?

EN

回答 8

Stack Overflow用户

发布于 2009-04-05 06:44:18

您可以为NSDictionary创建一个类别来执行此操作--我在Cocoa库中也找不到标准的方法。我使用的代码如下所示:

代码语言:javascript
复制
// file "NSDictionary+UrlEncoding.h"
#import <cocoa/cocoa.h>

@interface NSDictionary (UrlEncoding)

-(NSString*) urlEncodedString;

@end

使用此实现:

代码语言:javascript
复制
// 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中更详细地讨论它。

票数 47
EN

Stack Overflow用户

发布于 2014-06-30 18:23:01

我重构了AlBeebe并将其转换为ARC答案

代码语言:javascript
复制
- (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:@"&"];

}

代码语言:javascript
复制
- (NSString *)escapeValueForURLParameter:(NSString *)valueToEscape {
     return (__bridge_transfer NSString *) CFURLCreateStringByAddingPercentEscapes(NULL, (__bridge CFStringRef) valueToEscape,
             NULL, (CFStringRef) @"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8);
}
票数 8
EN

Stack Overflow用户

发布于 2014-12-24 16:03:04

如果您已经在使用AFNetworking (我就是这样),那么可以使用它的类AFHTTPRequestSerializer来创建所需的NSURLRequest

[[AFHTTPRequestSerializer serializer] requestWithMethod:@"GET" URLString:@"YOUR_URL" parameters:@{PARAMS} error:nil];

如果您只需要作品的URL,请使用NSURLRequest.URL

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/718429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档