簡體   English   中英

NSURL帶有花括號

[英]NSURL with Curly Braces

NSURL不支持在URL中使用花括號(即{})。 我的應用程序需要與需要在URL中使用花括號的服務器通信。 我正在考慮使用橋接器以Python或C ++編寫網絡代碼,甚至重寫NSURL的C代碼以使其接受花括號。 我的遠程服務器不接受百分比轉義。

我還有其他好的選擇嗎?

編輯:解釋為什么addPercentEscapesUsingEncoding等在這里不適合我。

如果你逃避括號,它會對你有用嗎?

這段代碼:

// 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];

編輯:

在下面的評論中,您說您的服務器不接受編碼的大括號,還有其他選擇。 首先,我會嘗試修復服務器。 如果那是不可能的......我沒有用括號等嘗試過這個......但是NS網絡類下面的層是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!),但另一種解決方案是使用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。 如果對{}進行編碼,則服務器不會返回正確的值。

還有其他建議可以解決這個帖子的問題嗎

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM