问题:如何在 Swift 中的 HTTP Head 字段使用的字符串中包含引号(“)

最近我使用 GitHub API 请求一些资源,我发现 Etag 可以帮助我,因为它可以避免重复的 URL 请求。但是,我遇到了包含 ETag 的 HTTP 请求问题。

根据 ETag(https://en.wikipedia.org/wiki/HTTP_ETag),如果你想将之前的 Etag 与当前的 URL 请求结果进行比较,你应该在 HTTP Header 中发送该信息,即键值对包含在 HTTP 标头字段中的应该具有这样的形式

 If-None-Match: "686897696a7c876b7e"

从上面的观察来看,如果我得到这样的 Etag

 Etag = "W/\"e1a6465809efe351293dd5bda041a795\""

我应该保存部分 e1a6465809efe351293dd5bda041a795

然后我在 swift 中使用两种代码来执行 URL 请求

第一种方法(包括引号)

// components[1]:String = "e1a6465809efe351293dd5bda041a795"
request.setValue("\"\(components[1])\"", forHTTPHeaderField: "If-None-Match")

第二种方法(不含引号)

// components[1]:String = "e1a6465809efe351293dd5bda041a795"
request.setValue("\(components[1])", forHTTPHeaderField: "If-None-Match")

即使 Etag 没有改变,它们也无法工作。

结果是这样的:

status code: 200, headers {
"Access-Control-Allow-Credentials" = true;
"Access-Control-Allow-Origin" = "*";
"Access-Control-Expose-Headers" = "ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval";
"Cache-Control" = "public, max-age=60, s-maxage=60";
"Content-Encoding" = gzip;
"Content-Security-Policy" = "default-src 'none'";
"Content-Type" = "application/json; charset=utf-8";
Date = "Tue, 07 Jul 2015 00:46:53 GMT";
Etag = "W/\"e1a6465809efe351293dd5bda041a795\"";

我很困扰。

如果 Etag 保持不变,响应状态应该是 304,但是每次我请求我都会得到 200,即使结果没有变化。

我认为问题可能是由 swift 中的报价表示引起的,有人可以帮助我吗?

注意事项

问题出在我的 github repoGitPocket,希望有人可以直接在 repo 中帮助我!你可以通过 ctrl + F 找到问题 problem here

解答

在尝试了 Alamofire 之后,我能够修复它。我使用了以下请求

let URL = NSURL(string: "https://api.github.com/users/jindulys/received_events")!
let mutableURLRequest = NSMutableURLRequest(URL: URL)
mutableURLRequest.HTTPMethod = "GET"

//let parameters = ["foo": "bar"]
mutableURLRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
mutableURLRequest.setValue("\"ae651e23bd54274b1c046e7b804feeb7\"", forHTTPHeaderField: "If-None-Match")

return Alamofire.request(mutableURLRequest)

我认为问题只存在于 iOS 9.0,我认为是 iOS 9.0 SDK 的问题。

Logo

ModelScope旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!

更多推荐