#ios #json #post #httprequest #swift3
#iOS #json #Публикация #httprequest #swift3
Вопрос:
Я просто пытаюсь отправить строку JSON через httprequest Swift3.
Пробовал использовать словарь и экранированную строку…
func getToken(successHandler: @escaping (Any) -> Void, errorHandler: @escaping (Any) -> Void) {
var request = URLRequest(url: URL(string: "http://my-api.domain.com/getToken")!)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
do
{
// try with Dictionary
let bodyJson: [String: String] = [
"username": "theusername"
]
let bodyJsonData = try JSONSerialization.data(withJSONObject: bodyJson, options: [])
// try with escaped String
let jsonString = "{"
""username": "theusername","
"}"
let jsonStringData = jsonString.data(using: String.Encoding.utf8)
//request.httpBody = bodyJsonData
request.httpBody = jsonStringData
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard error == nil else {
print(error)
errorHandler(error)
return
}
guard let data = data else {
print("Data is empty")
errorHandler("Data is empty")
return
}
var json: Any? = nil
do
{
json = try JSONSerialization.jsonObject(with: data, options: [])
DispatchQueue.main.asyncAfter(deadline: .now()) {
successHandler(json)
}
}
catch let error as NSError {
errorHandler(error)
}
}
task.resume()
}
catch
{
errorHandler(error)
}
}
Я продолжаю получать:
Обработайте ошибку: Ошибка домена = NSCocoaErrorDomain Code = 3840 «Текст JSON не начинался с массива или объекта, и опция, позволяющая не устанавливать фрагменты». userInfo={NSDebugDescription=Текст в формате JSON не начинался с массива или объекта, и опция, позволяющая не устанавливать фрагменты. }
Я не могу найти, как попробовать разрешить фрагменты, все примеры / учебные пособия предназначены для Swift2.x :/
Не уверен, что делать!
Ответ №1:
// prepare json data
let mapDict = [ "1":"First", "2":"Second"]
let json = [ "title":"ABC" , "dict": mapDict ] as [String : Any]
do {
let jsonData = try JSONSerialization.data(withJSONObject: json, options: .prettyPrinted)
// create post request
let endpoint: String = "https://yourAPI"
let session = URLSession.shared
let url = NSURL(string: endpoint)!
let request = NSMutableURLRequest(url: url as URL)
request.httpMethod = "POST"
// insert json data to the request
request.httpBody = jsonData
let task = session.dataTask(with: request as URLRequest){ data,response,error in
if error != nil{
print(error?.localizedDescription)
return
}
}
task.resume()
} catch {
print("bad things happened")
}
Комментарии:
1. Хммм, я использую узел. Сервер JS (платформа Hapi) и консоль am. регистрирую request.payload, и я вижу, что я передаю, но оно странно вложено, поэтому я не могу его разобрать… запрос.полезная нагрузка = { ‘ {«имя пользователя»: «имя_пользователя»} ‘: ‘ ‘ } … как будто мой json вложен в одинарные кавычки, но также является ключом к какому-то следующему словарю
2. Мне пришлось добавить … запрос.setValue(«application / json», для httpheaderfield: «Content-Type») … все хорошо, я очень благодарен вам за помощь!!! С Днем благодарения !!!
![]()
3. это все еще происходит, если вы заменили options: .prettyPrinted на options: []
4. Во время моей отладки одной из первых вещей, которые я сделал, было удаление .prettyPrinted для [] … как я видел n в моем запросе.полезная нагрузка… итак, ДА, это ответ на ваш вопрос… Я буду тестировать прямо сейчас с помощью .prettyPrinted … загрузка … оба работают… однако необходим набор заголовков… Я не эксперт по серверу / api, но есть ли способ для сервера ожидать json? Потому что забывание установить application / json является для меня распространенной проблемой: S