当我的Rails服务器返回304时,Alamofire响应对象返回200状态代码

时间:2016-05-06 16:18:00

标签: ios ruby-on-rails swift alamofire http-status-codes

当我向rails服务器发送请求并且304未被修改时,almofire响应对象返回状态码200。 如何更改我的请求,以便获取我的rails服务器返回的304状态代码? 我用cocoapods安装了Alamofire。

修改

我的代码目前(不工作):

if Reachability.isConnectedToNetwork() {
        let urlreq = NSMutableURLRequest(URL: NSURL(string: API.feedURL())!,cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData
            , timeoutInterval: 5000)
        Alamofire.request(.GET, urlreq, parameters: ["category_name":category],encoding: ParameterEncoding.URL, headers: API.getHeaders())
                    .validate(statusCode: 200..<500)
                    .responseJSON { request, response, result in
                        switch result {
                        case .Success(let data):
                            let statusCode = response!.statusCode as Int!
                            if statusCode == 304 {
                                completionHandler(didModified: false, battlesArray: [])
                            } else if statusCode == 200 {
                                let json = JSON(data)
                                var battlesArray : [Battle] = []
                                for (_,subJson):(String, JSON) in json["battles"] {
                                    battlesArray.append(Battle(json: subJson))
                                }
                                completionHandler(didModified: true, battlesArray: battlesArray)
                            }
                        case .Failure(_, let error):
                            print ("error with conneciton:\(error)")
                        }
                        SVProgressHUD.dismiss()
} else {
        //nothing important
}

这是kpsharp回答(不工作)之后的代码:

if Reachability.isConnectedToNetwork() {
            let urlreq = NSMutableURLRequest(URL: NSURL(string: API.feedURL()+"?category_name=Popular")!,cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData      , timeoutInterval: 5000)
    urlreq.HTTPMethod = "GET"
    let headers = API.getHeaders()
    for (key,value) in headers {
        urlreq.setValue(value, forHTTPHeaderField: key)
    }
    urlreq.cachePolicy = .ReloadIgnoringLocalAndRemoteCacheData
    Alamofire.request(urlreq)
} else {
//nothing interesting
}

编辑2

我的用于缓存的rails代码:

def index
  battles = Battle.feed(current_user, params[:category_name], params[:future_time])

  @battles = paginate battles, per_page: 50

  if stale?([@battles, current_user.id], template: false)
    render 'index'
  end
end

由于

1 个答案:

答案 0 :(得分:1)

This is a known issue in Alamofire already.

Alamofire成员

cnoon建议:

  

很好的问题......完全可能已经存在。您需要将URLRequestConvertible与NSMutableURLRequest结合使用,以覆盖该特定请求的cachePolicy。查看文档,你会明白我的意思。

编辑:在回复您的评论时,我会提供一些快速的代码,希望能够解决这些问题。

所以问题是你已经缓存了响应。对于大多数用例,当你实际收到304时返回200就可以了 - 毕竟,服务器接受了请求没有问题,只是报告没有变化。但是,无论你需要什么,你实际上需要看到304,这是有效的,但我们必须忽略缓存的响应。

因此,当您构建请求时,您可以按照Alamofire documentation创建类似的内容:

let URL = NSURL(string: "https://httpbin.org/post")!
let mutableURLRequest = NSMutableURLRequest(URL: URL)
mutableURLRequest.HTTPMethod = "POST"

let parameters = ["foo": "bar"]

do {
   mutableURLRequest.HTTPBody = try NSJSONSerialization.dataWithJSONObject(parameters, options: NSJSONWritingOptions())
} catch {
   // No-op
}

mutableURLRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")

这就是普通请求的样子。但是,我们需要覆盖cachePolicy的{​​{1}},如下所示:

mutableURLRequest

之后,只需将它踢到Alamofire即可发送:

mutableURLRequest.cachePolicy = .ReloadIgnoringLocalAndRemoteCacheData