2015-02-23 145 views
0

我想要做一个简单的iOS(目标C)使用模拟器而不是一个真正的设备。iOS的HTTP'获得'有一个URL长度限制

NSMutableURLRequest *newRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:theGetURL] 
                   cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData 
                  timeoutInterval:10]; 
    [newRequest setHTTPMethod: @"GET"]; 

    NSError *requestError2; 
    NSURLResponse *urlResponse2; 


    NSData *response2 = [NSURLConnection sendSynchronousRequest:newRequest returningResponse:&urlResponse2 error:&requestError2]; 
    NSString* secondResponse = [[NSString alloc] initWithData:response2 encoding:NSUTF8StringEncoding]; 

    NSLog(@"error = %@",requestError.localizedDescription); 
    NSLog(@"response=%@",secondResponse); 
    NSLog(@"url response = %@",urlResponse); 

当我传递一个简单的URL时,此代码完美工作。当我用较长的URL(大约4000个字符)尝试代码时,代码不起作用(不打印错误)。

我知道一个帖子更适合这种事情,但我的问题是,这是从一个获取请求的预期?

此外,我的网址在我的Mac和iOS浏览器中完美工作。

+1

也许检查'newRequest'的URL是否有效(可能是一些转义,这似乎是错误的)。 – Larme 2015-02-23 10:00:44

+0

我已经在日志中打印了'theGetURL',并且已经在模拟器浏览器上进行了测试,并且按预期工作。 – danb 2015-02-23 10:03:43

+0

从你说的是什么,你已经打印了'NSString',但不是'[NSURL URLWithString:theGetURL]'? – Larme 2015-02-23 10:04:44

回答

0

正如你怀疑的,我认为你需要考虑移动使用POST而不是GET。服务器端的限制是8K,但对于客户端来说这似乎要少得多。

以下讨论总结得很好。这似乎也意味着Safari的限制是2K,这可能意味着它与iOS相同或更低,这将解释4000个字符的问题。

maximum length of HTTP GET request?

1

我觉得你的网址查询参数可能有未编码的字符。尝试确保它。 对于编码,你可以试试这个代码

- (NSString *)encodeQueryParameter:(NSString *)str 
{ 
    CFStringRef ref = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, 
                   (__bridge CFStringRef)str, 
                   NULL, 
                   CFSTR(":/=,!$&'()*+;[]@#?"), 
                   kCFStringEncodingUTF8); 
    NSString *result = (__bridge_transfer NSString *)ref; 
    return result; 
} 
+0

我的查询有很多'%'符号。我为这些实例使用了双重'%'作为转义字符。我应该在尝试此方法之前删除转义字符吗? – danb 2015-02-23 11:23:08

+0

Hi @danb,由于我不确定你的网址结构如何,我的意见是请阅读以下链接http://blog.lunatech.com/2009/02/03/what-every-web-developer-must- know-about-url-encoding。您可能会发现它对URL和编码工作很有用。那么你一定能够决定哪里出了问题,在哪里。 – eNipu 2015-02-23 11:41:28

+0

下面是一个示例url:'http://10.2.176.100:9000/recorddata?mobileData={%22mobileData%22:[{%22cpu%22:-51,%22date%22:%22142441374.5834%22,%22memory %22:978,%22battery%22:-96,%22deviceID%22:2}]}' – danb 2015-02-23 11:47:25