J'essaie d'écrire une demande POST sur mon serveur local, voici ma fonction:
@IBAction func postButtonAction(_ sender: UIButton) {
guard let url = URL(string:"http://localhost:443/api/message") else {return}
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
print("POSTED")
let date : Date = Date()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let dateTime = dateFormatter.string(from: date)
let newPost = MessageForPost(message: "Hi", timestamp: dateTime, latitude: "1.1", longitude: "2.2")
let newData = DataForPost(message: newPost)
let newPackage = PackageForPost(data: newData)
do {
let jsonBody = try JSONEncoder().encode(newPackage)
request.httpBody = jsonBody
print("jsonBody:",jsonBody)
let jsonBodyString = String(data: jsonBody, encoding: .utf8)
print("JSON String : ", jsonBodyString!)
} catch let err {
print("jsonBody Error: ",err)
}
let session = URLSession.shared
let task = session.dataTask(with: request){ (data,response,err) in
guard let data = data else {return}
do{
let sendPost = try JSONDecoder().decode(PackageForPost.self, from: data)
print("DATA:\(data)")
}catch let err{
print("Session Error: ",err)
}
}
task.resume()
}
Ce sont les structures utilisant ici:
struct PackageForPost:Encodable, Decodable{
let data: DataForPost
}
struct DataForPost:Encodable, Decodable{
let message: MessageForPost
}
struct MessageForPost:Codable {
let message: String
let timestamp: String
let latitude: String
let longitude: String
}
Et il a pu imprimer
JSON String : {"data":{"message":{"message":"Hi","timestamp":"2017-10-18 00:50:13","latitude":"1.1","longitude":"2.2"}}}
Mais il continue de montrer cette ERREUR:
Erreur de session: dataCorrupted (Swift.DecodingError.Context (codingPath: [], debugDescription: "Les données fournies n'étaient pas JSON valide.", Sous-jacentError: Facultatif (Error Domain = NSCocoaErrorDomain Code = 3840 "Le texte JSON n'a pas commencé avec le tableau ou l'objet) et option pour autoriser les fragments non définis. "UserInfo = {NSDebugDescription = Le texte JSON n'a pas commencé avec le tableau ou l'objet et l'option pour autoriser les fragments non définis.})))
Pourquoi n'est-ce pas un JSON valide ???
Voici l'API de mon serveur POST document de demande:
POST
/api/message
{
data: {
message: {
message: “Hey, a new message!”,
timestamp: 2017-09-10 10:22:33,
latitude: 62.233589156441724,
longitude: 25.735066461654696
}
}
}
J'ai fait pas mal de recherches sur Google, mais je suis coincé ici depuis très longtemps! Toute aide appréciée!
C'était simple .. j'ai eu le même genre de problème ..
Regardez que votre structure est un horodatage de décodage et d'encodage, la latitude et la longitude comme Strings et JSON est de type Double ou Flottant.
struct MessageForPost:Codable {
let message: String
let timestamp: String
let latitude: String
let longitude: String
}
Et ici Json
{
data: {
message: {
message: "Hey, a new message!",
timestamp: 2017-09-10 10:22:33,
latitude: 62.233589156441724,
longitude: 25.735066461654696
}
}
}
.... Je l'ai réparé de mon côté et ... ça a fonctionné ..
Modifié utilisez le même type de données ..