URL编码iOS NSURL错误
在Firefox中打开的URL,桌面上的Chrome浏览器,在iPhone上的WebView中不打开。 这个URL据说是访问一个GET请求。 当创buildNSURL没有percentescaping的url不会得到生成。 当使用percentescape时,url会redirect到一个Bad url内容。
在桌面浏览器上使用不同的编码,而不是在iPhone上使用? 或移动Safari? 有没有不同的方式来编码在iOS中的URL,而不是使用
-stringByAddingPercentEscapesUsingEncoding -CFURLCreateStringByAddingPercentEscapes
从服务器生成不好的请求内容页面。
任何帮助将是非常好的,谢谢。
编辑:
生成的URL如下
http://something.test.com/iostest/index.html?{"a":"b"}
pipe理认为,不编码大括号是造成iOS中的问题。 如在
NSString *tempUrlSting = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)tempURLA,CFSTR("{}"), CFSTR("\""), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding))); NSURL *tempUrl=[NSURL URLWithString:tempUrlSting];
- 如果不是在URL中对大括号进行编码,而是使用[Rob's answer] [1]对其余的进行编码,如上所述。 创buildNSURL时,url是空的。
- 如果对大括号进行编码,则生成的URL很好,但服务器会引发exception。
这个问题build议使用CFNetworking。
编辑
使用CFNetworking如下
-(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议请问?
有时候,URL编码格式已经可以编码为%c3%a9了。 桌面浏览器是相当自由与无效的URL,这就是为什么它在Safari等。所以,如果你有一个NSString,你想要转换成一个合适的URL编码,然后使用下面的方法NSString类。
NSURL * url = [NSURL URLWithString:[strURL stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
你应该编辑你的问题,向我们展示你的URL和GET参数的例子。 如果你的百分比转义,例如,在域名或URLpath中的一些保留字符,这表明一个解决scheme(例如stringByAddingPercentEscapesUsingEncoding
是好的)。 如果你在GET
请求的参数(特别是=
或+
)的参数中转义了大量的保留字符,那么stringByAddingPercentEscapesUsingEncoding
根本就没有达到这个工作,你必须使用CFURLCreateStringByAddingPercentEscapes
(但只能在参数键和它们的值,而不是完整的URLstring)。 当我将它们附加到URL时,我在参数上使用类似以下的方法:
- (NSString *)percentEscapeURLParameter:(NSString *)string { return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)string, NULL, (CFStringRef)@":/?@!$&'()*+,;=", kCFStringEncodingUTF8)); }
如果您说CFURLCreateStringByAddingPercentEscapes
不适合您,您将不得不向我们展示如何使用它。 确保你只是在GET
参数值上进行操作,你提供了必要的“合法字符来转义”参数,你不是逃避不应该的东西,等等。