我正在尝试向我的本地服务器编写POST请求,这是我的函数:
@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()
}
这里使用的是以下结构体:
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
}
它能够打印
JSON String : {"data":{"message":{"message":"Hi","timestamp":"2017-10-18 00:50:13","latitude":"1.1","longitude":"2.2"}}}
会话错误:dataCorrupted(Swift.DecodingError.Context(codingPath: [],debugDescription:“给定的数据无效JSON。”, underlyingError:Optional(Error Domain = NSCocoaErrorDomain Code = 3840 “JSON文本未以数组或对象开头,并且没有设置选项允许 片段。”UserInfo = {NSDebugDescription = JSON文本没有 开始与数组或对象和选项不允许片段。}))
为什么它不是有效的JSON???
这是我的服务器API POST请求文件:
POST
/api/message
{
data: {
message: {
message: “Hey, a new message!”,
timestamp: 2017-09-10 10:22:33,
latitude: 62.233589156441724,
longitude: 25.735066461654696
}
}
}
我已经进行了相当多的谷歌搜索,但在这里卡了很长时间!任何帮助都感激不尽!
Data
解码为String
并打印出来,以确保你知道自己要解码的内容,因为如果以POST
开头,那就是你的问题所在。 - MadProgrammerdecode
行之前打印接收到的数据:print(data as NSData)
。第一个字节必须是7B
。错误信息显示它不是。 - vadian[
或{
其中之一开头。可能服务器返回的不是JSON格式的响应。 - JeremyPSession Error
开头的字符串相关,因此它是服务器响应。 - vadian