NSUrlConnection同步请求,不接受重定向

时间:2017-07-05 12:36:13

标签: macos delphi nsurlconnection lazarus

我目前正在为Delphi / Lazarus程序中的HTTP / HTTPs请求实现使用macOS API的代码。

代码在其自己的线程中运行(即不是主/ ui线程),并且是跨Windows / Mac和Delphi / Lazarus的更大的基于线程的爬虫的一部分。我尝试使用OS API实现实际的HTTP / S请求部分 - 但是请处理我自己处理和处理HTTP标头。

这意味着我希望尽可能继续使用同步模式。

我希望请求只返回给我服务器返回的内容。

不希望跟随重定向。

我目前使用 sendSynchroniousRequest_returningResponse_error

我尝试过搜索Google,但是在使用同步请求时似乎没办法?这看起来有点奇怪。

1 个答案:

答案 0 :(得分:1)

不,NSURLConnection的同步功能非常有限,并且从未扩展过,因为它非常不鼓励。也就是说,技术上可以实现您尝试做的事情。

我的回忆,从一个NSURLSession等效替换该方法一次(在一个二进制文件库中对该方法的一个漏洞较少的替换),你需要基本上编写一个使用共享字典的方法为每个NSURLSessionDataTask存储一个信号量(使用数据任务作为键)。然后,将信号量计数设置为零,以便在等待时立即阻塞,在主线程上异步启动异步请求,然后等待信号量(在当前线程中)。在异步数据任务的完成处理程序块中,您可以递增信号量,从而解除对调用线程的阻塞。

诀窍是确保会话在一个线程上运行其回调,而不是当前线程(被阻塞等待信号量)。因此,当您实际启动数据任务时,您需要将dispatch_async分配到主线程中。

表面上,如果您支持将任务转换为相关委托方法中的下载任务或流任务,您还需要采取适当的操作来更新共享字典,但我假设您赢了&# 39;使用该功能。 : - )