如何在查询参数包含&amp ;?时创建URL

时间:2015-01-01 05:52:02

标签: ios iphone rest url ios7

此问题并非针对iOS,但由于我正在iOS开发应用程序,因此我看到了这个问题。

我将URL创建为

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSString *transactionsUrl = [NSString stringWithFormat:@"%@/%@/%@/%i/%i?categoryGroup=%@",
                                                       appUrl, @"rest/transactions", [userDefaults valueForKey:kMemberId], year, month, [categoryGroup stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSLog(@"getting transactions for URL:%@", transactionsUrl);

我的查询参数categoryGroup可以是以下值之一

A & BB & C
我在`iOS客户端日志上看到的是

2014-12-31 21:38:44.654 myapp-ios[41275:70b] getting transactions for URL:https://myapp.com/rest/transactions/78f7f8a4-a8c9-454a-93a8-6633a1076781/2014/12?categoryGroup=A%20&%20B  

但是在服务器上,我看到了

categoryGroup=A

因此服务器上未收到整个queryParameter。

可能是什么潜在问题?

2 个答案:

答案 0 :(得分:0)

您需要对参数进行编码:

http://en.wikipedia.org/wiki/Percent-encoding

"&"变为%26

答案 1 :(得分:0)

&分隔GET参数。从技术上讲,您在服务器上看到categoryGroup = "A "(" A"后跟空格)。

潜在的问题是stringByAddingPercentEscapesUsingEncoding并没有逃脱应该做的事情(并且确实逃脱了它不应该做的事情),例如&。 改为使用CFURLCreateStringByAddingPercentEscapesthis answer

NSString *encodedString = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, NULL, CFSTR("!*'();:@&=+$,/?%#[]"), kCFStringEncodingUTF8));