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. I need to fix this error urgently. Could you help?
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()
}
}
}