json - URLSession.shared.dataTask 返回零字节
问题描述
我的目标是调用一个返回 json 的 http 服务,该服务将被解析为 NewsModel 对象的数组。
我定义了一个这样的结构
struct NewsModel: Decodable {
var id: Int
var title: String
var content: String
}
并在Service.swift类中编写了这个方法:
func getNews(pageSize: Int, pageCount: Int, completion: @escaping ([NewsModel]?) -> ()) {
guard let url = URL(string: "\(Service.baseURLSSMService)/news?pageSize=\(pageSize)&pageCount=\(pageCount)") else {return}
var retVal = [NewsModel]()
// Create URLRequest
var request = URLRequest(url: url)
// Set headers and http method
request.httpMethod = "GET"
request.cachePolicy = URLRequest.CachePolicy.reloadIgnoringLocalCacheData
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
guard let dataResponse = data,
error == nil else {
print(error?.localizedDescription ?? "Response Error")
completion(nil)
return }
do{
print("RESPONSE:\(response.debugDescription)")
retVal = try
JSONDecoder().decode([NewsModel].self, from: dataResponse)
completion(retVal)
} catch let parsingError {
print("Error", parsingError)
completion(nil)
}
}
task.resume()
}
我需要从我的HomeViewController调用这个方法。我在 viewDidLoad 中使用了这段代码:
Service.sharedInstance.getNews(pageSize: 10, pageCount: 1) { (news) in
// I need the first element of the news array
// I save it into a global variable
self.homeNews = news?.first
DispatchQueue.main.async {
if self.homeNews != nil {
self.myLabel.text = self.homeNews?.title
}
else {
self.myLabel.text = "No data received."
}
}
}
当我运行代码时,getNews 函数总是返回 0 字节,因此 JSONDecoder 无法解析任何内容。这是错误消息:
错误dataCorrupted(Swift.DecodingError.Context(codingPath:[],debugDescription:“给定的数据不是有效的JSON。”,underlyingError:可选(错误域=NSCocoaErrorDomain Code=3840“无值。” UserInfo={NSDebugDescription=无值.})))
如果我在上次收到正确值时调用它两次。我究竟做错了什么?因为我想我做错了什么,但我无法理解。
编辑 1:
这是一个 json 示例:
[
{
"id": 2048,
"title": "title-sample-1",
"content": "content-sample-1"
},
{
"id": 2047,
"title": "title-sample-2",
"content": "content-sample-2"
}
]
编辑 2:
这是 response.debugDescription
RESPONSE:Optional(<NSHTTPURLResponse: 0x2830a1160> { URL: http://.../news?pageSize=1&pageCount=1 } { Status Code: 400, Headers {
Connection = (
close
);
Date = (
"Tue, 27 Nov 2018 15:38:38 GMT"
);
"Transfer-Encoding" = (
Identity
); } })
解决方案
推荐阅读
- python-3.x - 将数组转换为列表
- api - 如何以编程方式下载美国银行交易?
- abap - 如何在发货日期前 14 天获得到期日?
- php - Twilio Connect:取消授权 URL
- c# - How to make a nuget package that have a system dependency?
- c# - 用于访问 SPO 列表的 SSIS Visual C# 脚本组件
- wordpress - 如何检查产品是否在篮子里,如果它在篮子里,用加号和减号替换它?
- sql - PostgreSQL IN 运算符不起作用,但模式匹配起作用
- mongodb - MongoDB 聚合将 ObjectID 转换为 toString
- r - ggResidpanel:为“resid_panel”图表添加副标题或标题