代码之家  ›  专栏  ›  技术社区  ›  Source

没有尸体时如何处理

  •  1
  • Source  · 技术社区  · 1 年前

    通常,在删除请求中,响应代码为 204 (no content)

    当没有json解码的主体时,您是如何使用Combine处理这种情况的。

    func deleteById(_ id: Int) -> AnyPublisher<Void, Error> {
        var request = URLRequest(url: URL(string: "http://domain/products/\(id)")!)
        request.httpMethod = "DELETE"
    
        return session.dataTaskPublisher(for: request)
                .map { (data, response) -> AnyPublisher<Void, Error> in
                    Just(())
                            .setFailureType(to: Error.self)
                            .eraseToAnyPublisher()
                }
                .eraseToAnyPublisher()
    }
    

    企图

    func deleteById(_ id: Int) -> AnyPublisher<Void, Error> {
        var request = URLRequest(url: URL(string: "http://domain/products/\(id)")!)
        request.httpMethod = "DELETE"
    
        return session.dataTaskPublisher(for: request)
                .map { _ in return } // return nothing
                .eraseToAnyPublisher()
    }
    
    1 回复  |  直到 1 年前
        1
  •  0
  •   Sweeper    1 年前

    URLSession.dataTaskPublisher 为您提供一个具有 Failure 的类型 URLError 。方法的返回类型表示返回值应该具有 失败 正义的类型 Error

    请注意 flatMap 只能更改 失败 键入到 Never (有点像 setFailureType )。它无法将其更改为另一个 错误 类型 mapError 是什么改变了故障类型。

    return URLSession.shared.dataTaskPublisher(for: request)
        .map { _ in () } // '()' is a value of Void
        .mapError { $0 as Error }
        .eraseToAnyPublisher()
    

    其他需要考虑的事项:

    • 刚回来 AnyPublisher<Void, URLError>
    • 使用 ignoreOutput() 而不是 map 返回 AnyPublisher<Never, URLError> 。这是一个不发布任何值,只发布完的发布者。