URLSession.shared.dataTask возвращать нулевые байты

голоса
0

Моя цель состоит в том, чтобы вызвать службу HTTP, который возвращает JSON, чтобы быть разобраны как массив объектов 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: Нет значения Дополнительно (Error Domain = NSCocoaErrorDomain Code = 3840 UserInfo = {NSDebugDescription = Нет значения .})))

Если я называю это дважды в последний раз соответствующие значения принимаются. Что я делаю неправильно? Потому что я думаю, что я делаю неправильно что-то, но я не могу получить его.

EDIT 1 :

Это пример JSON:

[
  {
    id: 2048,
    title: title-sample-1,
    content: content-sample-1
  },
  {
    id: 2047,
    title: title-sample-2,
    content: content-sample-2
  }
]

EDIT 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
    ); } })
Задан 27/11/2018 в 15:09
источник пользователем
На других языках...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more