Я отправляю запрос 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, как и с завитком, но по какой-то причине 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"}
curl
, это должен быть действительный JSON, учитывая ваше сообщение об ошибке, похоже, что это не так. Трудно сказать, не видя, что вы фактически получаете. Пожалуйста, попробуйте распечататьprint(String(data:response.data, encoding: .utf8))
и предоставьте нам результат, возможно, это поможет. (И, пожалуйста, сделайте это, отредактировав свой вопрос, поскольку вы можете видеть, что код имеет тенденцию выглядеть беспорядочно в (более ограниченных) комментариях.) - person Patru   schedule 04.05.2018curl
вы передаете параметр даты, который вы передаете в своем коде? - person Mike Taverne   schedule 04.05.2018