问题描述
给出我负责处理正文的发布者。比我可以解码为User结构。效果很好。
// Wrapped Request,return with an URLRequest object with POST method
let request = RequestWithModel(networkMethod: .post,path: PathBuilder().user().build(),model: User(userId: 1,title: "fokora",body: "baroka")).urlRequest()
let addUser : AnyPublisher<User,Error> = URLSession.shared.dataTaskPublisher(for: request)
.map{ $0.data }
.decode(type: User.self,decoder: JSONDecoder())
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()
当响应为空json主体时如何处理响应,但是我想知道响应是否成功(状态码为200)?我需要使用哪种发布者?
// Wrapped Request,return with an URLRequest object with DELETE method
let request = RequestWithoutModel(networkMethod: .delete,path: PathBuilder().user().id(id: "1").build()).urlRequest()
let deleteUser : AnyPublisher<... no need this ...,Error> = URLSession.shared.dataTaskPublisher(for: request)
.map{ $0.data }
.decode(type: ... no need this ...,decoder: JSONDecoder()) // no need to decode anything at all
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()
在此先感谢您提供的帮助。
解决方法
如果您只关心响应,则应该map
属性response
而不是data
。如果还要检查响应代码,则应将response
强制转换为HTTPURLResponse
。
let deleteUser = URLSession.shared.dataTaskPublisher(for: request)
.compactMap { $0.response as? HTTPURLResponse }
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()
这将导致发布商类型为AnyPublisher<HTTPURLResponse,URLSession.DataTaskPublisher.Failure>
。
如果只需要状态码,则可以在.map(\.statusCode)
之后调用compactMap
-或将compactMap
的主体更改为($0 as? HTTPURLResponse).statusCode
,这将导致输出类型为Int
而不是HTTPURLResponse
的发布商。