【发布时间】:2019-12-30 21:40:51
【问题描述】:
我正在寻找一种方法来传递在先前的POST 请求中收到的更多数据。下面是我的代码。
实际结果:authtoken 和 sms_id 变为空的String。
一些澄清:当第一个完成时,第二个POST 请求在序列中的下一个屏幕中调用。 TIA。
import SwiftUI
import Combine
enum APIError: Error {
case responseProblem
case decodingProblem
case encodingProblem
}
class NetworkService: ObservableObject {
@Published var user: UserRegisterRequest?
@Published var userRegistered: UserRegistered?
let uuid = UIDevice.current.identifierForVendor?.uuidString
let appid = "com.website.me"
var authToken = ""
var sms_id = ""
func postPhoneValidation(_ phone: String, completion: @escaping (Result<UserRegisterRequest, APIError>) -> Void) {
do {
guard let url = URL(string: APIRequests.postPhoneValidation) else { fatalError() }
let body: [String: Any] = ["phone" : phone]
let finalBody = try JSONSerialization.data(withJSONObject: body)
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.httpBody = finalBody
request.setValue(uuid, forHTTPHeaderField: "X-AUTH-Device")
request.setValue(appid, forHTTPHeaderField: "X-AUTH-AppID")
URLSession.shared.dataTask(with: request) { data, response, _ in
guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200,
let jsondata = data else {
completion(.failure(.responseProblem))
return
}
do {
let validatedPhoneDictionary = try JSONDecoder().decode(UserRegisterRequest.self, from: jsondata)
self.authToken = validatedPhoneDictionary.auth_token
self.sms_id = validatedPhoneDictionary.sms_id
completion(.success(validatedPhoneDictionary))
print(validatedPhoneDictionary)
} catch {
completion(.failure(.decodingProblem))
}
}
.resume()
} catch {
completion(.failure(.encodingProblem))
}
}
func postSignUp(_ otpSms: String, completion: @escaping (Result<UserRegistered, APIError>) -> Void) {
do {
guard let url = URL(string: APIRequests.postSignUp) else { fatalError() }
let body : [String: Any] = ["otpSms" : otpSms, "sms_id" : self.sms_id]
let finalBody = try! JSONSerialization.data(withJSONObject: body)
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.httpBody = finalBody
request.setValue(uuid, forHTTPHeaderField: "X-AUTH-Device")
request.setValue(appid, forHTTPHeaderField: "X-AUTH-AppID")
request.setValue(self.authToken, forHTTPHeaderField: "X-AUTH-Token")
URLSession.shared.dataTask(with: request) { data, response, _ in
guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200,
let jsondata = data else {
completion(.failure(.responseProblem))
return
}
do {
let registeredUser = try JSONDecoder().decode(UserRegistered.self, from: jsondata)
completion(.success(registeredUser))
print(registeredUser)
} catch {
completion(.failure(.decodingProblem))
}
}
.resume()
}
}
}
【问题讨论】:
-
你已经展示了你编写的方法,但你从来没有展示过你是如何调用它们的。
-
@creeperspeak,嗨!感谢您的评论。它让我再次检查我的代码。