【问题标题】:POST request errors in swiftswift中的POST请求错误
【发布时间】:2020-04-05 06:29:05
【问题描述】:

我是 swift 新手(我更习惯于 python),我正在尝试向服务器发送 POST 请求并使用 JSON 响应。我已经能够使用从教程中获得的这段代码发出 POST 请求并检索数据并打印它,但变量 server.authenticated 没有改变,在我做了一些更改之后,现在我得到了两个错误:@987654321 @和'String' is not convertible to 'Any'

有人可以帮忙吗?

import SwiftUI
import Combine


struct ServerMessage : Decodable {
    let status, message: String
}

class HttpAuth: ObservableObject {
    var didChange = PassthroughSubject<HttpAuth, Never>()

    @Published var authenticated = false {
        didSet{
            didChange.send(self)
        }

    }


    func checkDetails(username: String, password: String) {
        guard let url = URL(string: "https://example.com") else { return  }

        let body: [String: String] = ["username": username, "password": password ]

        let finalBody = try! JSONSerialization.data(withJSONObject: body)

        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.httpBody = finalBody

        request.setValue("application/json", forHTTPHeaderField: "Content-Type")

        URLSession.shared.dataTask(with: request) { (data, response, error) in

            guard let data = data else { return }

            let finalData = try! JSONDecoder().decode(ServerMessage.self, from: data)

            print(finalData)
            if finalData.status == "ok" {
                DispatchQueue.global().async {
                    HttpAuth.authenticated = true  //ERROR: Instance member 'authenticated' cannot be used on type 'HttpAuth'
                    print("correct credentials")
                }
            }


        }.resume()
    }
}



struct loginView: View {

    @State private var username: String = ""
    @State private var password: String = ""

    @State var server = HttpAuth()

    var body: some View {
        VStack{

            TextField("Username", text: $username)
            .textFieldStyle(RoundedBorderTextFieldStyle())
            .frame(width: 200, height: nil)
            .multilineTextAlignment(.center)
            .disableAutocorrection(true)
            .accessibility(identifier: "Username")
            .autocapitalization(.none)

            SecureField("Password", text: $password)
            .textFieldStyle(RoundedBorderTextFieldStyle())
            .frame(width: 200, height: nil)
            .multilineTextAlignment(.center)
            .disableAutocorrection(true)
            .accessibility(identifier: "Password")

            Button(action: {
                self.server.checkDetails(username: self.username, password: self.password)
                //print(self.username + ", " + self.password)
            }) {
                HStack{
                    Spacer()
                    Text("Login").font(.headline).foregroundColor(.white)
                    Spacer()
                }.padding(.vertical, 10)
                .background(Color.red)
                .padding(.horizontal, 40)

            }
            if self.server.authenticated {
                Text("Correct Credentials")
            }        //ERROR: 'String' is not convertible to 'Any'
        }
    }
}

struct loginView_Previews: PreviewProvider {
    static var previews: some View {
        loginView()
    }
}

【问题讨论】:

  • 需要改成self.authenticated = true
  • 我更改了它并修复了错误,但 server.authenticated 仍然打印为 false。我在 if self.server.authenticated 上面放了一个 Text(server.authenticated) (我删除了 self)

标签: json swift post swiftui


【解决方案1】:

您需要像

一样将 HttpAuth 传递给您的 loginView
struct loginView_Previews: PreviewProvider {
    static var previews: some View {
        loginView().environmentObject(HttpAuth())
    }
}

然后在你的 LoginView 中声明 HttpAuth 的 EnvironmentObject

struct loginView: View {
    @State private var username: String = ""
    @State private var password: String = ""
    @EnvironmentObject var server : HttpAuth
    ...

【讨论】:

  • 您能否再解释一下 loginView().environmentObject(HttpAuth()) 。我是 swift 新手,不知道应该把它放在哪里
  • 更新了代码。 EnvironmentObject(HttpAuth()) 调用 loginView() 时需要传递有关 EnvironmentObject 的更多信息,可通过iosapptemplates.com/blog/swiftui/… 找到
  • 感谢您的帮助,我收到错误消息:线程 1:致命错误:未找到 HttpAuth 类型的 ObservableObject。
  • struct loginView_Previews: PreviewProvider { static var previews: some View { loginView().environmentObject(HttpAuth()) } }
猜你喜欢
  • 1970-01-01
  • 2017-09-30
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 2019-12-15
相关资源
最近更新 更多