我正试图从我的node.js Express服务器返回一个字符串。它是一个基本的服务器,返回"hello, world!"但不是作为JSON
对象,而是作为常规字符串。这是我的代码从我的请求。
URLSession
.shared
.dataTaskPublisher(for: request)
.map(.data)
.decode(type: String.self, decoder: decoder)
.receive(on: DispatchQueue.main)
我认为我做得对但是我得到了这个但是当我运行它时,我得到了这个错误:The data couldn't be read because it isn't in the correct format.
所以,根据评论,我没有返回JSON
,所以我不能使用JSONDecoder
。也就是说,我想以通用的方式使用它,一些api将返回JSON
,一些将返回String
s,一些将返回Int
s,一些将返回Array<Codable>
。是否有一种方法可以使用组合来尝试从我的各种API端点获得这些值?
我知道我可以这样做:
URLSession
.shared
.dataTaskPublisher(for: request)
.map(.data)
.compactMap { String(data: $0, encoding:. utf8) }
.receive(on: DispatchQueue.main)
,但是我想用这个函数调用我的每个端点。有人能帮忙吗?
您不需要解码器,只需使用string初始化器将数据转换为字符串。
var cancels: Set<AnyCancellable> = []
func fetchData() {
URLSession
.shared
.dataTaskPublisher(for: request)
.map(.data)
.compactMap { String(data: $0, encoding:. utf8) }
.receive(on: DispatchQueue.main)
.sink (
receiveCompletion: {
print("Completion: ($0)")
},
receiveValue: { result in
print("String: (result)")
})
.store(in: &cancels)
}
我个人放弃了单一发布者链,我有两个HTML调用和一个模型数据调用。但后来我发现了sharedPublisher的例子。虽然我坚持使用两次调用的方法而不是这种方法,但至少它值得思考。我个人只会在一种情况下调用模型的数据调用,而在另一种情况下可以使用callHTML的网页的HTML请求…
共享发布者允许你在。datataskpublisher (for:url)之后中断
let sharedPublisher = urlSession
.dataTaskPublisher(for:url)
.share()
cancellable1 = sharedPublisher
.tryMap() {return $0.data}
.decode(type: T.self, JSONDecoder())
.recieve(on: DispatchQueue.main)
.sink(receiveCompletion: {}, receiveValue: {}
cancellable2 = sharedPublisher
.map() { $0.response }
.sink( receiveCompletion: {},
receiveValue: { response in print("html") } )