首页 > 解决方案 > 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
    ); } })

标签: jsonswifturlsessionnsurlsessiondatatask

解决方案


推荐阅读