Ошибки POST-запроса в swift - PullRequest
0 голосов
/ 05 апреля 2020

Я новичок в swift (я более привык к python), и я пытаюсь отправить POST-запрос на сервер и использовать ответ JSON. Я смог сделать POST-запрос, получить данные и распечатать их, используя этот код, полученный из руководства, но переменная server.authenticated не изменилась, и после внесения некоторых изменений я получаю две ошибки: Instance member 'authenticated' cannot be used on type 'HttpAuth' и '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()
    }
}

1 Ответ

0 голосов
/ 07 апреля 2020

Вам необходимо передать HttpAuth вашему loginView, например

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

, затем в вашем LoginView объявить EnvironmentObject of HttpAuth

struct loginView: View {
    @State private var username: String = ""
    @State private var password: String = ""
    @EnvironmentObject var server : HttpAuth
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...