gpt4 book ai didi

ios - NSUrlConnection 同步请求没有跟随重定向

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:02:00 24 4
gpt4 key购买 nike

问题

我需要执行同步 HTTP 请求,不遵循重定向,最好不使用实例变量,因为这将被合并到 j2objc 中项目。

我尝试了什么

我已经尝试使用 NSURLConnection sendSynchronousRequest,不幸的是不能轻易告诉它不要遵循重定向。

背景

在告诉我不应该使用同步请求之前,请记住这段代码是用来模拟 Java 的 HttpUrlConnection 的。 ,对于 j2objc,其行为本质上是同步的项目。 IosHttpUrlConnections' native makeSynchronousRequest的执行当前始终遵循重定向。它应该尊重 HttpUrlConnection.instanceFollowRedirects field .

进行了进一步的研究

  • 在异步模式下使用 NSUrlConnection 时,会调用委托(delegate)方法,允许启用/禁用重定向。但是,我需要同步操作。
  • This answer on NSUrlconnection: How to wait for completion展示了如何使用异步请求实现 sendSynchronousRequest。但是,我无法修改它以使用委托(delegate),因此无法不遵循重定向。

希望你能帮帮我

最佳答案

您可以使用带有信号量的 NSURLSession,像这样创建:

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:nil];
NSURLSessionTask *task = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

if (data)
{
// do whatever you want with the data here
}
else
{
NSLog(@"error = %@", error);
}

dispatch_semaphore_signal(semaphore);
}];
[task resume];

// but have the thread wait until the task is done

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

并且您必须实现以下 NSURLSessionTaskDelegate 方法,并调用 completionHandler block 传递 null 以停止重定向。

- (void)URLSession:(NSURLSession *)session
task:(NSURLSessionTask *)task
willPerformHTTPRedirection:(NSHTTPURLResponse *)response
newRequest:(NSURLRequest *)request
completionHandler:(void (^)(NSURLRequest *))completionHandler

关于ios - NSUrlConnection 同步请求没有跟随重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27961107/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com