Я отправляю запрос POST на свой бэкэнд, но получаю эту ошибку:
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.})))
И вот код, который я использую для отправки / извлечения данных:
func fetchDataWithParameters(){
struct Response: Codable {
let status: String?
let error: String?
}
let decoder = JSONDecoder()
HTTP.POST("somelinkhere", parameters: ["date": self.weekDays[self.itemSelectedIndex]]) { response in
if let error = response.error {
print("got an error: \(error)")
return
}
do {
let resp = try decoder.decode(Response.self, from: response.data)
if let err = resp.error {
print("got an error: \(err)")
}
if let status = resp.status {
print("completed: \(status)")
}
} catch let error {
print("decode json error: \(error)")
}
}
}
Используя мой терминал, я пытаюсь выполнить POST-запрос вручную и получаю следующее:
Admins-MacBook-Pro:hello-world admin$ curl -i -H "Accept: application/json" -H "Content-Type: application/json" somelinkhere
HTTP/1.1 200 OK
Server: openresty/1.9.15.1
Date: Thu, 03 May 2018 23:42:04 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 39
Connection: keep-alive
X-Clacks-Overhead: GNU Terry Pratchett
"{\"name\": \"Timo\", \"age\": \"39\"}"
Это заставляет меня задуматься, что единственно возможной ошибкой может быть то, как я декодирую JSON. Почему еще это будет работать с терминалом? Есть идеи?
Как @patru предложил, я включил печать здесь:
catch let error {
print(String(data:response.data, encoding: .utf8)!)
print("decode json error: \(error)")
}
Это был результат:
"{\"name\": \"Mergim\", \"age\": \"39\"}"
decode json 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, как я сделал с curl, но по какой-то причине swift не видит его как действительный JSON? Вот как мой метод записи выглядит в бэкэнде:
@app.route('/', methods=['GET', 'POST'])
def index():
jsonData = {"name": "Timo", "age": "39"}
jsonData1 = {"name": "Mergim", "age": "39"}
if request.method=='GET':
return json.dumps(jsonData)
elif request.method=='POST':
return json.dumps(jsonData1)
РЕДАКТИРОВАТЬ
jsonData = '{"name": "Timo", "age": "39"}'
jsonData1 = '{"name": "Mergim", "age": "39"}'
изменено на:
jsonData = {"name": "Timo", "age": "39"}
jsonData1 = {"name": "Mergim", "age": "39"}