使用 URLSession 和合并处理 HTTP 状态代码

Mat*_*oal 4 swift urlsession combine

我正在尝试处理通过读取其响应状态代码而到达的响应DataTaskPublisher

当状态代码大于 299 时,我想返回一个ServiceError失败类型。在我见过的每个示例中,我都使用过.mapError.......catch在这种特定情况下,从 a .flatMap,我真的不知道如何处理发布者响应以返回错误而不是TResponse......

    return URLSession.DataTaskPublisher(request: urlRequest, session: .shared)
        .mapError{error in return ServiceError.request}
        .flatMap{ data, response -> AnyPublisher<TResponse, ServiceError> in

            if let httpResponse = response as? HTTPURLResponse,
                (200...299).contains(httpResponse.statusCode){

                return Just(data)
                    .decode(type: TResponse.self, decoder: JSONDecoder())
                    .mapError{error in return ServiceError.decode}
                    .eraseToAnyPublisher()
            }else{
                //???? HOW TO HANDLE THE ERROR?
            }
        }
        .receive(on: RunLoop.main)
        .eraseToAnyPublisher()
Run Code Online (Sandbox Code Playgroud)

gan*_*ena 5

enum ServiceErrors: Error { 
    case internalError(_ statusCode: Int)
    case serverError(_ statusCode: Int)
}
    
return URLSession.shared.dataTaskPublisher(for: urlRequest)
            .tryMap { data, response in
                guard let httpResponse = response as? HTTPURLResponse,
                    200..<300 ~= httpResponse.statusCode else {
                        switch (response as! HTTPURLResponse).statusCode {
                        case (400...499):
                            throw ServiceErrors.internalError((response as! HTTPURLResponse).statusCode)
                        default:
                            throw ServiceErrors.serverError((response as! HTTPURLResponse).statusCode)
                        }
                }
                return data
            }
            .mapError { $0 as! ServiceErrors }
            .decode(type: T.self, decoder: JSONDecoder())
            .receive(on: RunLoop.main)
            .eraseToAnyPublisher()
Run Code Online (Sandbox Code Playgroud)

注意:我依靠链接来制作我的错误处理程序。