【问题标题】:Does an iOS http 'get' have a URL length limitiOS http 'get' 是否有 URL 长度限制
【发布时间】:2015-02-23 09:56:13
【问题描述】:

我正在尝试使用模拟器而不是真实设备在 iOS(目标 C)中进行简单的获取。

    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 时,这段代码可以完美运行。当我尝试使用更长(大约 4000 个字符)url 的代码时,代码不起作用(不打印错误)。

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

另外,我的 url 在我的 mac 和 iOS 浏览器中完美运行。

【问题讨论】:

  • 也许检查 newRequest 的 URL 是否有效(也许有些转义似乎是错误的)。
  • 我已经在日志中打印了theGetURL,我已经在模拟器浏览器上对其进行了测试,它可以按预期工作。
  • 从你的意思来看,你打印的是NSString,但不是[NSURL URLWithString:theGetURL]
  • NSLog(@"The URL:%@", [NSURL URLWithString:theGetURL]); 返回空值。我做得对吗?
  • 检查stringByAddingPercentEscapesUsingEncoding:stackoverflow.com/questions/3418754/…

标签: ios objective-c


【解决方案1】:

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

下面的讨论很好地总结了一切。这似乎也暗示 Safari 的限制是 2K,这可能意味着它与 iOS 相同或更少,这可以解释您的 4000 个字符的问题。

maximum length of HTTP GET request?

【讨论】:

    【解决方案2】:

    我认为您的 URL 查询参数可能包含任何未编码的字符。尝试确保它。 对于编码,您可以尝试此代码

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

    【讨论】:

    • 我的查询中有很多% 标志。对于这些实例,我在各处都使用双 % 作为转义字符。在尝试此方法之前我应该​​删除转义字符吗?
    • 嗨@danb,由于我不确定您的URL 是如何构成的,我的意见是请阅读以下链接blog.lunatech.com/2009/02/03/…。您可能会发现它对 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}]}
    • %22 是一个引号。您不需要使用双 %。编码方法应注意 URL 中的 %22。我会尝试测试这个网址。
    • 谢谢,等待您的回复。
    猜你喜欢
    • 2010-09-20
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 2011-06-30
    • 2020-05-20
    相关资源
    最近更新 更多