иногда получаю ошибку при обработке моего запроса в моей dataTask - PullRequest
0 голосов
/ 02 октября 2018

Я использую URLSession в своем проекте iOS (Swift 4).

var postRequest = URLRequest(url: myUrl)
    request.httpMethod = "POST"
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")

let dataTask = defaultSession.dataTask(with: postRequest) { data, response, error in
        if let error = error {
          // Sometimes I get error here
          showError(error.localizedDescription)
        } else if let data = data,
          let response = response as? HTTPURLResponse,
          response.statusCode == 200 {
          // most of the time, everything is fine
          ...
        }

dataTask?.resume()

Когда я запускаю код для разговора с моим сервером, у меня обычно не возникает проблем, все работает как положено.Но иногда я получаю не ноль error, localizedDescription говорит There was an error processing your request.

Я не уверен, как это исправить, потому что я не получаю больше отладочной информации, и это происходит только случайно.

Может ли кто-нибудь указать мне правильное направление, что может вызвать эту ошибку при использовании URLSession при разговоре с сервером?

1 Ответ

0 голосов
/ 20 октября 2018

Это ошибка на стороне сервера - вероятно, 500 или 502, но, возможно, что угодно.Если вы напечатаете код ошибки, вы, возможно, узнаете немного больше.

Кроме того, по умолчанию NSURLSession сбрасывает соединение, когда возвращает код ошибки, но можно указать, что нужно извлечь данные страницы ошибок.(который может содержать еще больше информации о том, что пошло не так).

Чтобы сделать это, добавьте метод делегата к делегату сеанса, например,

- (void)URLSession:(NSURLSession *)session 
          dataTask:(NSURLSessionDataTask *)dataTask 
didReceiveResponse:(NSURLResponse *)response 
 completionHandler:(void (^)(NSURLSessionResponseDisposition
                   disposition))completionHandler {
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)httpResponse;
    // For server errors or success status, fetch the response body, else cancel.
    if (httpResponse.statusCode >= 500 && httpResponse.statusCode <= 599) {
        completionHandler(NSURLSessionResponseAllow);
    } else if (httpRepose.statusCode == 200) {
        completionHandler(NSURLSessionResponseAllow);
    } else {
        completionHandler(NSURLSessionResponseCancel);
    }
}

Конечно, вам также придетсясоздать и сохранить сеанс (поскольку сеанс по умолчанию не имеет делегата).

...