我正在尝试向本地服务器写一个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"}}}
Session Error: dataCorrupted(Swift.DecodingError.Context(codingPath:
[],debugDescription: “The given data was not valid JSON.”,
underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840
“JSON text did not start with array or object and option to allow
fragments not set.” UserInfo={NSDebugDescription=JSON text did not
start with array or object and option to allow fragments not set.})))
为什么它不是有效的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 } } }
我做了一些谷歌搜索,但我被困在这里很长一段时间!
任何帮助赞赏!
这很简单..我有同样的问题..
看看您的Struct是解码和编码时间戳,纬度和经度,就像字符串和JSON是Double或Floating类型一样.
struct MessageForPost:Codable { let message: String let timestamp: String let latitude: String let longitude: String }
而在这里Json
{ data: { message: { message: “Hey,longitude: 25.735066461654696 } } }
….我把它固定在我的最后……它工作了..
编辑使用相同的数据类型..