我正在创建 Alamofire 请求,并将 startRequestsImmediately 设置为 false。然后我将一个 block 排入一个 NSOperationQueue 队列,它根据请求调用 resume() 。如果我需要暂停传出请求,我只需暂停队列并让它们缓冲起来。一旦我取消挂起队列,所有请求都会被分派(dispatch)。
有时,当队列暂停时,我需要更改其中任何现有请求的 header (例如授权 token )。我还没有找到执行此操作的方法(我尝试的任何操作都没有生效)。 NSURLSessionTask 有可能吗?是否可以为给定请求(使用更新的 header )换出 NSURLSessionTask?
最佳答案
一旦创建了 Alamofire.Request,它就会在后台创建一个 NSURLSessionTask,一旦创建,它实际上是只读的。因此,我发现的唯一选择是将 Request 的创建推迟到我的请求即将运行时。
但是,Request 对象是您设置响应处理程序的对象。例如,客户端想要调用如下内容:request().response(...).response(...)。 Alamofire 的 request() 返回 Request 对象,您可以在该对象上多次调用 response() 以设置将运行一次的响应处理程序请求完成。但是,如果您需要推迟 Request 的创建,直到您知道它即将运行 - 这样您就可以在那个时候使用最新的 header - 您如何将它返回给客户,以便他们可以在上面调用 .response()?
我这样做的方法是在我的上创建一个 myRequest() 包装器(而不是能够覆盖实际的 request() 函数/名称) Alamofire.Manager 派生类,它带有 1 个额外参数 - 一个“请求就绪” block (它本身带有一个 Alamofire.Request),而不是返回 来自 ,myRequest() 的请求myRequest(),不返回任何内容,但调用 block (将 Request 传递给它)就像请求即将被发送。
有点像
manager.request(.GET, "endpoint").responseJSON(…)
反而变成了
manager.myRequest(.GET, "endpoint") { request in
request.responseJSON(...)
}
通过这种方式,我可以推迟 Alamofire.Request 的创建(它会立即创建底层 NSURLSessionTask 并在当时锁定 header )直到稍后,同时不会给客户带来太多不便,因为他们如何指定响应处理程序。
myRequest() 看起来像这样(不包括特定于应用程序的内容):
func myRequest(
method: Alamofire.Method,
_ URLString: URLStringConvertible,
parameters: [String: AnyObject]? = nil,
encoding: ParameterEncoding = .URL,
headers: [String: String]? = nil,
requestReady: ((Request) -> Void)?) {
pendingRequestsQueue.addOperationWithBlock { [weak self] in
if let strongSelf = self {
let request = strongSelf.request(method, URLString, parameters: parameters, encoding: encoding, headers: headers)
if let requestReady = requestReady {
requestReady(request)
}
request.resume()
}
}
}
关于ios - 在恢复之前修改 Alamofire 请求的 header ()d,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32384309/
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?
在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.
我正在使用Heroku(heroku.com)来部署我的Rails应用程序,并且正在构建一个iPhone客户端来与之交互。我的目的是将手机的唯一设备标识符作为HTTPheader传递给应用程序以进行身份验证。当我在本地测试时,我的header通过得很好,但在Heroku上它似乎去掉了我的自定义header。我用ruby脚本验证:url=URI.parse('http://#{myapp}.heroku.com/')#url=URI.parse('http://localhost:3000/')req=Net::HTTP::Post.new(url.path)#boguspara