HTTP Status 400 – Bad Request - Swift - Post API

Viewed 45

I'm making a POST function but I'm getting an error. I am getting

HTTP Status 400 – Bad Request

error in console. In the simulator, it says

Something went wrong. Please try again later

on the screen. I don't understand where I am making the mistake.

JSON Model:

struct TaniTalep: Encodable {

    let photo: Data?
    let xray: Data?
    let talep: String
   
    init(photo: UIImage?, xray: UIImage?, talep: Talep) throws {

        self.photo = photo?.pngData()
        self.xray = xray?.pngData()

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

        self.talep = String(data: jsonData, encoding: .utf8)!
    }
}

struct Talep: Codable {

    let tanitalepid: Int
    let hastaid: Int
    let cevap: String
    let anamnezList: [Anamnez]
    let sikayetanaList: [SikayetAna]
    let sorucevapList: [SoruCevap]

    struct SoruCevap: Codable {

        let sikayetsoruid: Int
        let soru: String
        let sorucevap: String
    }

    struct SikayetAna: Codable {

        let sikayet: String
        let sikayetanaid: Int
    }

    struct Anamnez: Codable {

        let aciklama: String
        let anamnezid: Int
        let cevap: String
        let nitelik: String
        let sonaltiay: String
    }
}

Web Service:

func postTaniTalep(token: String, email: String, tanitalepid: Int, taniTalep: TaniTalep) async throws -> Bool {

        guard let url = URL(string: "http://ec2-3-74-42-117.eu-central-1.compute.amazonaws.com:8080/dentistodayapis/inserttanitalep") else {

            throw NetworkError.invalidURL
        }

        var request = URLRequest(url: url)

        request.httpMethod = "POST"

        request.setValue("multipart/form-data", forHTTPHeaderField: "Content-Type")
//        request.addValue("application/json", forHTTPHeaderField: "Accept")
        request.addValue("\(token)", forHTTPHeaderField: "credentialtoken")
        request.addValue("\(email)", forHTTPHeaderField: "username")
        request.addValue("IOS", forHTTPHeaderField: "platform")
        request.addValue("TR", forHTTPHeaderField: "langcode")

        let formData = try JSONEncoder().encode(taniTalep)

        print("\(Date())-\(#line)--\(#function)--formData: \(String(data: formData, encoding: .utf8))-")

        request.httpBody = formData

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

        print(url)
        print(String(data: data, encoding: .utf8))

        return (response as? HTTPURLResponse)?.statusCode == 200

    }

View:

final class TaniTalepViewModel: ObservableObject {

    static let shared = TaniTalepViewModel()

    init() {}

    

    var hastaID: Int?
    var cevap: String?
    var soruCevapList = [Talep.SoruCevap]()
    var sikayetAnaList = [Talep.SikayetAna]()
    var anamnezList = [Talep.Anamnez]()
    var photo: UIImage?
    var xray: UIImage?

    @Published var message: String?

    @MainActor

    func postTaniTalep() async {

        guard

            let hastaID = hastaID,

            let cevap = cevap

        else {

            assertionFailure("Insufficient data")

            return

        }

        

        let defaults = UserDefaults.standard

        guard let token = defaults.string(forKey: "jsonwebtoken") else {

            return

        }

        guard let email = defaults.string(forKey: "email") else {

            return

        }

        do {

            let tanitalepid = try await Webservice().getSequenceNextval(token: token, email: email)

            let success = try await Webservice().postTaniTalep(token: token, email: email, tanitalepid: tanitalepid, taniTalep: TaniTalep(photo: photo, xray: xray, talep: .init(tanitalepid: tanitalepid, hastaid: hastaID, cevap: cevap, anamnezList: anamnezList, sikayetanaList: sikayetAnaList, sorucevapList: soruCevapList)))

            if success {

                message = "Your registration number \(tanitalepid) has been completed successfully.\n \(tanitalepid) numaralı kaydınız başarıyla tamamlanmıştır."

            } else {

                message = "Something went wrong. Please try again later."
            }
        } catch {

            print("\(Date())-\(#line)--\(#function)--error: \(error)-")

            message = "Error while posting tani talep: \(error)"
        }
    }
}

struct TaniTalepView: View {

    @ObservedObject private var viewModel = TaniTalepViewModel.shared

    
    var body: some View {

        ZStack {
            Color.flesh
                .ignoresSafeArea()

            if let message = viewModel.message {
                Text(message)
                    .padding()
            } else {
                ProgressView()
            }
        }
        .task {
            await viewModel.postTaniTalep()
        }
    }
}
0 Answers
Related