【发布时间】:2018-11-14 11:19:58
【问题描述】:
我有这个似乎只是随机弹出的 json 错误。
我从域加载 json 并将其解析为字典。如果错误没有发生,它就完美无缺。代码如下:
func retrieveCoinPairData() {
guard !checkIfBaseAndTargetAreEqual() else { return }
if let base = self.currentBase, let target = self.currentTarget {
if let url = URL(string: "https://api.cryptonator.com/api/full/\(base.code)-\(target.code)") {
URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in
if let error = error {
print(error.localizedDescription)
}
if let response = response {
print("reponse /api/full", response)
}
do {
if let data = data {
let jsonData = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String: Any]
self.createCoinPairData(with: jsonData)
} else {
self.delegate?.updateInfoLabelContent(content: .noInternetConnection)
}
} catch {
self.delegate?.updateInfoLabelContent(content: .error)
print("catch error", error, data?.description as Any)
self.retrieveCoinPairData()
}
}).resume()
} else {
self.delegate?.updateInfoLabelContent(content: .error)
}
}
}
服务器响应如下抛出 403 错误:
reponse /api/full <NSHTTPURLResponse: 0x608000232400> {
URL: https://api.cryptonator.com/api/full/BTC-ETH } {
status code: 403, headers {
Connection = "keep-alive";
"Content-Encoding" = gzip;
"Content-Type" = "text/html";
Date = "Tue, 05 Jun 2018 04:23:37 GMT";
"Keep-Alive" = "timeout=15";
Server = nginx;
"Transfer-Encoding" = Identit
并且 URLSession 捕获错误如下:
catch error Error Domain=NSCocoaErrorDomain Code=3840
"Invalid value around character 0."
UserInfo={NSDebugDescription=Invalid value around character 0.}
Optional("162 bytes")
错误出现在try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String: Any]这一行。
现在,无论何时发生此错误(而且是完全随机的),当我在浏览器中检查 url 时,它可以完美运行。
我用 jsonlint.com 检查了 json,它是有效的,没有顶级对象使 json 需要碎片,尽管该选项似乎减少了过去的错误。
我知道代码 403 错误告诉我网站阻止访问,代码 3840 错误告诉我没有要解析的内容。我仍然想知道错误发生的位置和原因。
这是本示例中使用的网站:https://api.cryptonator.com/api/full/btc-eth
【问题讨论】:
-
我怀疑在出现
403错误的情况下,您没有从服务器返回有效的 json(相反,您收到的是纯文本错误响应)。您可以在尝试使用print("\(String(data: data, encoding: String.Encoding.utf8))")对其进行反序列化之前打印出数据。 -
谢谢。它打印 "\r\n
403 Forbidden \r\n\r\n \r\n403 Forbidden
nginx \r\n\r\n\r\n" 所以是的正确的。知道什么可能导致这种情况吗?这甚至在我的权力范围内吗?让我烦恼的是,当我在浏览器中手动打开它时,该 url 随时可用 -
不相关但一如既往,如果预期类型是集合类型,选项
.allowFragments毫无意义。省略options参数。要解决问题,请处理响应代码。 -
是的,你是对的
-
所以我联系了他们,他们说如果超过 100 个呼叫/分钟,该网站将自动禁止该 IP(一段时间)。这是有道理的,尽管我不会说我的应用程序通过测试甚至接近这一点。等待他们的另一个答复。
标签: json swift macos api urlsession