POST请求错误迅速

问题描述 投票:0回答:1

我是swift的新手(我更熟悉python),我正尝试向服务器发送POST请求并使用JSON响应。我已经能够使用从教程中获得的这段代码来发出POST请求并检索数据并打印出来,但是变量server.authenticated并没有变化,在我进行了一些更改之后,我遇到了两个错误:[C0 ]和Instance member 'authenticated' cannot be used on type 'HttpAuth'

有人可以帮忙吗?

'String' is not convertible to 'Any'
json swift post swiftui
1个回答
0
投票

您需要将HttpAuth传递给您的loginView,例如

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()
    }
}

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

struct loginView_Previews: PreviewProvider {
    static var previews: some View {
        loginView().environmentObject(HttpAuth())
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.