当我向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
由于
答案 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