与curl括号的NSURL

NSURL不支持在URL中使用大括号(即{})。 我的应用程序需要与需要在URL中使用大括号的服务器通信。 我正在考虑使用桥梁来编写Python或C ++的networking代码,甚至是重写NSURL的C代码来使它接受花括号。 百分号转义不被我的远程服务器接受。

我有其他好的select吗?

编辑:解释为什么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) 

所以,转义似乎工作

以下是如何以编程方式转义url的方法:

 NSString *escapedUrlString = [unescaped stringByAddingPercentEscapesUsingEncoding: NSASCIIStringEncoding]; 

编辑:

在你的评论下面,你说你的服务器将不接受编码大括号,并有其他的select。 首先,我会尝试修复服务器。 如果这是不可能的…我没有尝试过这与括号等…但NSnetworking类下面的层是CFNetworking。

看到这个:

http://developer.apple.com/library/ios/#documentation/Networking/Conceptual/CFNetwork/CFHTTPTasks/CFHTTPTasks.html#//apple_ref/doc/uid/TP30001132-CH5-SW2

从那个文件:

  CFStringRef url = CFSTR("http://www.apple.com"); CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, url, NULL); CFStringRef requestMethod = CFSTR("GET"); .... 

再一次,没有尝试过,我就跑了。 稍后可能会尝试,但如果某个图层不工作,则您的第一个选项是向下移动堆栈。

Bryan的回答非常好(+1给他!),但另一种解决scheme是使用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]; 

我希望这个信息可以帮助你!

打电话使用CFNetwork可以使用下面的内容

 -(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。 如果{}被编码,则服务器不会返回正确的值。

任何其他build议来解决这个职位的问题?