NSURL不支持在URL中使用花括号(即{})。我的应用程序需要与需要在URL中使用大括号的服务器通信。我正在考虑使用桥接器来编写Python或C++中的网络代码,甚至为NSURL重写C代码以使它接受大括号。百分号转义不被我的远程服务器接受。带卷曲花括号的NSURL
我还有其他不错的选择吗?
编辑:解释为什么addingPercentEscapesUsingEncoding之类的不适合我这里工作。
NSURL不支持在URL中使用花括号(即{})。我的应用程序需要与需要在URL中使用大括号的服务器通信。我正在考虑使用桥接器来编写Python或C++中的网络代码,甚至为NSURL重写C代码以使它接受大括号。百分号转义不被我的远程服务器接受。带卷曲花括号的NSURL
我还有其他不错的选择吗?
编辑:解释为什么addingPercentEscapesUsingEncoding之类的不适合我这里工作。
如果你躲开大括号,它会适合你吗?
此代码:
// escape {} with %7B and %7D
NSURL *url = [NSURL URLWithString:@"http://somesite.com/%7B7B643FB915-845C-4A76-A071-677D62157FE07D%7D.htm"];
NSLog(@"%@", url);
// {} don't work and return null
NSURL *badurl = [NSURL URLWithString:@"http://somesite.com/{7B643FB915-845C-4A76-A071-677D62157FE07D}.htm"];
NSLog(@"%@", badurl);
输出:
2011-11-30 21:25:06.655 Craplet[48922:707] http://somesite.com/%7B7B643FB915-845C-4A76-A071-677D62157FE07D%7D.htm
2011-11-30 21:25:06.665 Craplet[48922:707] (null)
所以,逃避似乎工作
这里是你如何可以以编程方式逃避网址:
NSString *escapedUrlString = [unescaped stringByAddingPercentEscapesUsingEncoding: NSASCIIStringEncoding];
编辑:
在您的评论如下,你说你的服务器将不接受编码括号,是没有任何其他选择。首先,我会尝试修复服务器。如果这是不可能的......我还没有尝试过这与括号等...但NS网络类下面的层是CFNetworking。
看到这个:
从这个DOC:
CFStringRef url = CFSTR("http://www.apple.com");
CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, url, NULL);
CFStringRef requestMethod = CFSTR("GET");
....
再次,还没有尝试过了,我跑出来。可能会在稍后尝试,但如果图层不工作,则您的第一个选项是向下移动堆栈。
嘿布莱恩,感谢您的回应!不幸的是,似乎服务器不接受花括号的百分比转义值。有没有一种方法可以在目标c中使用显式花括号来形成GET请求? –
我添加了关于CFNetworking的注释 - 一种选择是继续向下移动堆栈。但是,如果可能的话,我会尝试并修复服务器:) – bryanmac
感谢您的更新。我们发现这是其他地方的一个小编码错误,正在让我们失望。问题已解决,但我会保留此代码以备将来参考,以防其他网络问题发生。 –
布赖恩的回答非常好(对他+1),但另一种解决方案是使用NSString的stringByAddingPercentEscapesUsingEncoding:
方法。
像这样:
NSString * originalURLAsString = [NSString stringWithString: @"http://somesite.com/{7B643FB915-845C-4A76-A071-677D62157FE07D}.htm"];
NSString * properlyEncodedString = [originalURLAsString stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
NSURL * url = [NSURL URLWithString: properlyEncodedString];
我希望这个信息可以帮助你!
+1 - 正在编辑我的,因为你附加了这个答案 - 我们的节省划线:) – bryanmac
嗨迈克尔,感谢发布!这个窍门对我来说不起作用,因为对方希望显式大括号,而不是百分比转义值。你知道一种方法来形成一个GET请求,并在目标c中使用明确的大括号吗? –
您是否可以控制您正在与之通话的服务器?服务器应该总是处理转义百分比的URL。 –
要调用使用CFNetwork的可以使用follwoing
-(void)getDataFromUrl{
CFStringRef tempURLA = CFSTR("http://my.test.server/iostest/index.html?{\"a\":\"b\"}");
CFStringRef tempUrlSting = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)tempURLA,CFSTR("{}"), CFSTR("\""), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, tempUrlSting, NULL);
CFStringRef requestMethod = CFSTR("GET");
CFHTTPMessageRef myRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, requestMethod, myURL,kCFHTTPVersion1_1);
CFStringRef headerFieldName = CFSTR("Accept");
CFStringRef headerFieldValue = CFSTR("text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
CFHTTPMessageSetHeaderFieldValue(myRequest, headerFieldName, headerFieldValue);
[self performHTTPRequest:myRequest];
}
-(void)performHTTPRequest:(CFHTTPMessageRef)request {
CFURLRef gotdatab = (__bridge CFURLRef)(CFBridgingRelease(CFHTTPMessageCopyRequestURL(request)));
// NSLog(@"(CFHTTPMessageRef request %@",gotdatab);
CFReadStreamRef requestStream = CFReadStreamCreateForHTTPRequest(NULL, request);
CFReadStreamOpen(requestStream);
NSMutableData *responseBytes = [NSMutableData data];
NSError *error;
while (TRUE) {
if (CFReadStreamHasBytesAvailable(requestStream)) {
UInt8 streambuffer[1024];
int readBytes = CFReadStreamRead (requestStream,streambuffer,sizeof(streambuffer));
NSLog(@"Read: %d",readBytes);
[responseBytes appendBytes:streambuffer length:readBytes];
}
if (CFReadStreamGetStatus(requestStream) == kCFStreamStatusError) {
error = (NSError*)CFBridgingRelease(CFReadStreamCopyError (requestStream));
if ([error code] == 61) {
// connection refused
NSLog(@"Error occured: %d",[error code]);
}
break;
}
if (CFReadStreamGetStatus(requestStream) == kCFStreamStatusAtEnd) {
NSLog(@"Stream reached end!");
error = nil;
break;
}
}//
CFHTTPMessageRef response = (CFHTTPMessageRef)CFReadStreamCopyProperty(requestStream, kCFStreamPropertyHTTPResponseHeader);
if (response==NULL) {
NSLog(@"response is null");
return;
}
}
但是,即使上述方法有同样的问题。即:如果{}未编码,则URL不会生成。如果{}被编码,则服务器不会返回适当的值。
任何其他建议来解决这个职位的问题?
你可能要更新你的问题标题为NSURL带花括号 - 我认为你假设你需要一个替代方案... – bryanmac