如何将主体添加到Swift中使用Combine发出的HTTP GET请求中?
我正在使用Combine发出HTTP GET请求,但我不知道如何添加正文。我知道在GET请求中有一个主体是不好的,但是我真的需要测试一些东西。我使用的是Xcode 11.4和iOS 13.4。堆栈溢出不允许我发布这个问题,除非我写更多的信息,但我想不出你可能需要更多的信息。这是我的密码:如何将主体添加到Swift中使用Combine发出的HTTP GET请求中?,swift,httprequest,combine,Swift,Httprequest,Combine,我正在使用Combine发出HTTP GET请求,但我不知道如何添加正文。我知道在GET请求中有一个主体是不好的,但是我真的需要测试一些东西。我使用的是Xcode 11.4和iOS 13.4。堆栈溢出不允许我发布这个问题,除非我写更多的信息,但我想不出你可能需要更多的信息。这是我的密码: import Foundation import Combine //MARK: - Object to retrieve from JSON struct Doctor: Codable, Identifia
import Foundation
import Combine
//MARK: - Object to retrieve from JSON
struct Doctor: Codable, Identifiable {
let id = UUID()
let patients: [Patients]
}
struct Patients: Codable, Identifiable {
let id: String
let name: String
let phone: String
enum CodingKeys: String, CodingKey {
case id = "_id"
case name
case phone
}
}
class Network {
enum Error: LocalizedError {
case invalidResponse
case addressUnreachable(URL)
var errorDescription: String? {
switch self {
case .invalidResponse:
return "The server responded with garbage."
case .addressUnreachable(let url):
return "\(url.absoluteString) is unreachable."
}
}
}
let urlRequest = URL(string: URL)!
let networkQueue = DispatchQueue(label: "Networking",
qos: .default,
attributes: .concurrent)
func downloadPatients() -> AnyPublisher<Doctor, Error> {
URLSession.shared
.dataTaskPublisher(for: urlRequest)
.receive(on: networkQueue)
.map(\.data)
.decode(type: Doctor.self, decoder: JSONDecoder())
.mapError { (error) -> Network.Error in
switch error {
case is URLError:
return Error.addressUnreachable(self.urlRequest)
default:
return Error.invalidResponse
}
}
.eraseToAnyPublisher()
}
}
let networkRequest = Network()
func loadPatients() {
cancelable = networkRequest.downloadPatients()
.sink(
receiveCompletion: {
receiveValue: { doctor in
self.localPatients = doctor.patients
self.isShowing = false
}
)
}
谢谢大家! 我不确定是否可以使用dataTaskPublish来获取。但您可以通过此类呼叫自定义您的请求:
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.httpBody = body
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
URLSession.shared.dataTask(with: request) { (data, response, error) in
if let error = error {
// Handle the error here
}
guard let data = data else { return }
let resData = try! JSONDecoder().decode(ServerMessage.self, from: data)
}.resume()
}如果是POST呢?请将方法从GET更改为POST请求。httpMethod=POSTURLSession现在在尝试使用正文数据发出GET请求时会产生错误,因此不可能。此外,未来的HTTP标准也将强制执行此要求。