URL可以在Firefox和Chrome浏览器上打开,但在iPhone的WebView中无法打开。假定这个URL正在访问一个GET请求。当创建没有转义百分比的NSURL时,不会生成url。当使用percentescape时,url会重定向到错误的url内容。
在桌面浏览器上使用不同的编码而不是在iPhone上使用吗?还是移动Safari?在iOS中,除了使用
,还有其他方法来编码URL吗?-stringByAddingPercentEscapesUsingEncoding
-CFURLCreateStringByAddingPercentEscapes
从服务器生成错误的请求内容页。
任何帮助都会非常好,谢谢。
编辑:
生成的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为空。
这个问题建议使用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。如果{}被编码,服务器不会返回正确的值。
有什么建议吗?
有时URL已经编码了格式,除了可能应该编码为%c3%a9的扮成。桌面浏览器是相当自由的无效url,这就是为什么它在Safari等工作。如果你有一个NSString你想把它转换成一个正确的URL编码那么使用下面NSString类的方法。
NSURL* url = [NSURL URLWithString:[strURL stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
您应该编辑您的问题,向我们展示您的URL和GET参数的示例。例如,如果您要对域名或URL路径中的某些保留字符进行百分比转义,则建议使用一种解决方案(例如stringByAddingPercentEscapesUsingEncoding
就可以)。如果您在GET
请求(特别是=
或+
)的参数中对更广泛的保留字符数组进行百分比转义,那么stringByAddingPercentEscapesUsingEncoding
根本无法完成任务,您必须使用CFURLCreateStringByAddingPercentEscapes
(但仅限于参数键及其值,而不是完整的URL字符串)。当我将参数附加到URL时,我使用了如下方法:
- (NSString *)percentEscapeURLParameter:(NSString *)string
{
return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)string,
NULL,
(CFStringRef)@":/?@!$&'()*+,;=",
kCFStringEncodingUTF8));
}
如果你说CFURLCreateStringByAddingPercentEscapes
不适合你,你必须向我们展示你是如何使用它的。确保你只是在GET
参数值上做的,你提供了必要的"合法字符转义"参数,你没有转义不应该转义的东西,等等。