【问题标题】:Passing data to the next POST request from that was fetched in the previous one [Swift / SwiftUI]将数据传递给在前一个 [Swift / SwiftUI] 中获取的下一个 POST 请求
【发布时间】:2019-12-30 21:40:51
【问题描述】:

我正在寻找一种方法来传递在先前的POST 请求中收到的更多数据。下面是我的代码。 实际结果:authtokensms_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,嗨!感谢您的评论。它让我再次检查我的代码。

标签: json swift post


【解决方案1】:

我的问题的原因是在我调用第二种方法时,我创建了一个新的 NetworkService 实例,而不是作为 ObservedObject 访问它。当我改变它时,问题就解决了。 ——

【讨论】:

    猜你喜欢
    • 2021-10-08
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    相关资源
    最近更新 更多