7
respostas

Problemas com o login

O cadastro tem sucesso, pore nao consigo fazer o login, usei a logica cara decodificar o auth mas mesmo assim deu erro struct User: Decodable { let auth: String? let id: String? } ja fiz de tudo e nao funciona

7 respostas

a API recebe o login normalmente, mas na hora de fazer ologin, cai n erro

Olá Elisangela, tudo bem?

Pelo que você descreveu, parece que você está tendo problemas com a autenticação do usuário. Acredito que o problema possa estar relacionado com a decodificação do seu objeto User.

Primeiramente, certifique-se de que os nomes das propriedades em sua struct User correspondam exatamente aos nomes das chaves no JSON que você está tentando decodificar. Isso é importante porque o decodificador Decodable do Swift é sensível a maiúsculas e minúsculas.

Além disso, verifique se o JSON que você está tentando decodificar contém realmente as chaves 'auth' e 'id'. Se alguma dessas chaves não estiver presente no JSON, isso também pode causar um erro de decodificação.

Aqui está um exemplo de como você pode fazer isso:

do {
    let user = try JSONDecoder().decode(User.self, from: jsonData)
    print(user.auth)
    print(user.id)
} catch {
    print("Erro ao decodificar User: \(error)")
}

Neste exemplo, jsonData é um Data que contém o JSON que você está tentando decodificar. Se houver um erro na decodificação, ele será impresso no console.

Espero que essas sugestões possam te ajudar a resolver o problema.

Qualquer coisa compartilha o seu código aqui, assim fica melhor para eleborar uma resposta mais assertiva. Você pode colar o código aqui mesmo sem ser print.

Espero ter ajudado e bons estudos!

Eu tentei fazer isso la onde esta o User Decodable. pores esta dando erro, nao sei mais o que fazer. é desanimador pois a resposta demora muito para chegar e nao consigo dar continuidade ao curso, ai esta o que fiz, e agora dar erro

struct User: Decodable { let auth: String? let id: String?

do {
    let user = try JSONDecoder().decode(User.self, from: jsonData)
    print(user.auth)
    print(user.id)
} catch {
    print("Erro ao decodificar User: \(error)")
}

}

erro(Expectedt declaration)

caso tenha que fazer isso em outro lugar, por favor informar de uma forma clara e objetiva para que consigamos fazer. desde ja obrigada

A decodificação deve ser feita em algum ponto onde você tem acesso aos dados JSON, como em um método de inicialização, uma função específica para decodificação ou em outro contexto apropriado.

Vou deixar um exemplo:

import Foundation

struct User: Decodable {
    let auth: String?
    let id: String?
}

// Suponha que você tenha jsonData disponível, substitua isso pelo seu próprio JSON Data.

let jsonData = """
{
    "auth": "seu_token_de_autenticacao",
    "id": "seu_id_de_usuario"
}
""".data(using: .utf8)!

do {
    let user = try JSONDecoder().decode(User.self, from: jsonData)
    print("Autenticação: \(user.auth ?? "N/A")")
    print("ID: \(user.id ?? "N/A")")
} catch {
    print("Erro ao decodificar User: \(error)")
}

Neste exemplo:

  • A struct User é definida conforme a estrutura do JSON que você está tentando decodificar.
  • Criamos uma constante jsonData que contém um exemplo simplificado de dados JSON.
  • Utilizamos um bloco do-catch para tentar decodificar os dados JSON em uma instância da struct User.
  • Se a decodificação for bem-sucedida, imprimimos as informações do usuário (autenticação e ID).
  • Se ocorrer um erro durante a decodificação, imprimimos uma mensagem de erro.

Por favor, substitua o conteúdo de jsonData pelo seu próprio JSON Data. Isso é apenas um exemplo para ilustrar como a decodificação pode ser feita. Certifique-se de que os dados JSON que você está tentando decodificar tenham uma estrutura correspondente à da sua struct User.

  • Para uma resposta mais assertiva, seria legal você compartilhar mais detalhes do seu código, no caso você pode colar eles completos aqui mesmo.

Esse é o arquivo do login

mport Foundation

struct LoginRequest: Codable { let email: String let password: String

enum CodingKeys: String, CodingKey {
    case email
    case password = "senha"
}

}

struct LoginResponse: Identifiable, Codable { let auth: Bool let id: String let token: String }

struct User: Decodable { let auth: String? let id: String?}

e aqui esta a minha Webservice.

let patientID = "4c516423-b638-4066-8646-bc431ce3fbf0"

struct WebService {

private let baseURL = "http://localhost:3000"

func loginPatient(email: String, password: String) async throws -> LoginResponse? {
    let endpoint = baseURL + "/auth/login"

    guard let url = URL(string: endpoint) else {
        print("Erro na URL!")
        return nil
    }

    let loginRequest = LoginRequest(email: email, password: password)

    let jsonData = try JSONEncoder().encode(loginRequest)

    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.httpBody = jsonData

    let (data, _) = try await URLSession.shared.data(for: request)

    let loginResponse = try JSONDecoder().decode(LoginResponse.self, from: data)

    return loginResponse
}

Parece que o problema está na estrutura User que você está tentando decodificar. O User que você definiu não corresponde à estrutura dos dados que está recebendo na resposta do servidor. Aqui está a estrutura corrigida para User:

swift
Copy code
struct User: Codable {
    let auth: Bool
    let id: String
    let token: String
}

Tenta acessar o código da instrutora e comparar com o seu, pode haver alguma diferença entre os dois. Eu não vou deixar o link do código aqui porque não sei em que aula você está exatamente.

Qualquer coisa, se aparecer um erro novo, manda aqui.

Eu fiz exatamente o que vc me ensinou, nao tenho mais o erro na tela de login, porem nao aparece nada no console, eu faço o login, e nao acontece nenhuma açao, ainda nao chamei a tela seguinte, mas acho que deveria aparecer uma mensagem no console, certo? bem vou continuar tentando aqui ate resolver o problema rsrs