URL编码iOS NSURL错误



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];
  1. 如果不编码URL中的大括号,而是像上面那样使用[Rob的答案][1]编码其余部分。创建NSURL时,url为空。
如果对大括号进行编码,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参数值上做的,你提供了必要的"合法字符转义"参数,你没有转义不应该转义的东西,等等。

最新更新