在桌面上的 Firefox、Chrome 浏览器中打开的 URL 在 iPhone 上的 WebView 中无法打开。
该 URL 据称正在访问 GET 请求。
创建 NSURL 时不进行百分号转义,则不会生成 url。
使用percentescape 时,url 会重定向到错误的url 内容。
桌面浏览器上使用的编码是否与 iPhone 上使用的编码不同?或者手机 Safari 浏览器?
除了使用之外,还有其他方法在 iOS 中对 URL 进行编码吗
-stringByAddingPercentEscapesUsingEncoding
-CFURLCreateStringByAddingPercentEscapes
它会从服务器生成错误的请求内容页面。
任何帮助都会非常好,谢谢。
EDIT:
生成的URL如下
http://something.test.com/iostest/index.html?{"a":"b"}
设法发现未对大括号进行编码导致了 iOS 中的问题。
如
NSString *tempUrlSting = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)tempURLA,CFSTR("{}"), CFSTR("\""), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)));
NSURL *tempUrl=[NSURL URLWithString:tempUrlSting];
- 如果不对 URL 中的大括号进行编码,而是使用上面的 [Rob 的回答][1] 对其余部分进行编码。创建 NSURL 时,url 为空。
- 如果对大括号进行编码,则可以正常生成 URL,但服务器会抛出异常。
This Question https://stackoverflow.com/questions/8335796/nsurl-with-curly-braces建议使用CFNetworking。
EDIT
使用 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;
}
}
以上是使用以下示例完成的here http://jameswilliams.me/developer/blog/2008/08/http-post-via-the-cfnetwork-stack/ and here http://lists.apple.com/archives/macnetworkprog/2013/May/msg00000.html
上述方法仍然存在同样的问题。也就是说:如果 {} 未编码,则不会生成 URL。如果 {} 已编码,则服务器不会返回正确的值。
有什么建议吗?