Синтаксис JSON - Body Post запроса - SWIFT4 - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь получить JSON, используя запрос HTTP Post с сервера, но я думаю, что тело моего запроса неверно.Я перепробовал все и не могу найти решение.Приложение аварийно завершает работу.

Я попытался использовать другой синтаксис в теле запроса (переменная newTodo), например:

'{"api_key": "mykey123", "api_secret": "asdfg", "uniqueid": "csd23cdse34ww", "password": "secret123", "pin": "12345"} '

и

["api_key": "mykey123", "api_secret": "asdfg", "uniqueid": "csd23cdse34ww", "password": "secret123", "pin": "12345"]

Использованиевыше у меня есть ошибка:

["api_key": "mykey123", "password": "flibble1", "uniqueid": "csd23cdse34ww", "api_secret": "secret123", ""pin ":" 12345 "] 2019-01-25 10: 00: 54.298086 + 0000 APPTEST [8863: 646933] [logging] таблица" users "уже существует Таблица" users "уже существует (код: 1).
ошибкапарсинг ответа от POST на / todos

Отлично работает на Postman с телом

'{"api_key": "mykey123", "api_secret": "asdfg","uniqueid": "csd23cdse34ww", "password": "secret123", "pin": "12345",} '

но Xcodeпросит меня использовать приведенный ниже синтаксис.

func loginPressed() {
    let todosEndpoint: String = "https://mydevapi.com/authenticateuser"
    guard let todosURL = URL(string: todosEndpoint) else {
        print("Error: cannot create URL")
        return
    }
    var todosUrlRequest = URLRequest(url: todosURL)
    todosUrlRequest.httpMethod = "POST"

    let newTodo = "{\"api_key\":\"mykey123\",\"api_secret\":\"asdfg\",\"uniqueid\":\"csd23cdse34ww\",\"password\":\"secret123\",\"pin\":\"12345\"}"

    let jsonTodo: Data
    do {
        jsonTodo = try JSONSerialization.data(withJSONObject: newTodo, options: [])
        todosUrlRequest.httpBody = jsonTodo
        print(newTodo)
    } catch {
        print("Error: cannot create JSON from todo")
        return
    }

    let session = URLSession.shared

    let task = session.dataTask(with: todosUrlRequest) {
        (data, response, error) in
        guard error == nil else {
            print("error calling POST on /todos/1")
            print(error!)
            return
        }
        guard let responseData = data else {
            print("Error: did not receive data")
            return
        }

        // parse the result as JSON, since that's what the API provides
        do {
            guard let receivedTodo = try JSONSerialization.jsonObject(with: responseData, options: []) as? [String: Any] else {
                    print("Could not get JSON from responseData as dictionary")
            return
            }
            print(receivedTodo)
            print("The todo is: " + receivedTodo.description)

            guard let todoID = receivedTodo["id"] as? Int else {
                print("Could not get todoID as int from JSON")
                print(receivedTodo)
                return
            }
            print("The ID is: \(todoID)")
            print(receivedTodo)
        } catch  {
            print("error parsing response from POST on /todos")
            return
        }
    }
    task.resume()
}

Приложение аварийно завершает работу - Поток 1: сигнал SIGABRT

2019-01-25 09: 37: 05.762339 + 0000 APPTEST [8601: 615340]* Завершение приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «* + [NSJSONSerialization dataWithJSONObject: options: error:]: Неверный тип верхнего уровня в записи JSON» *** Первый стек вызова вызова: (0 CoreFoundation 0x00000001087f11bb исключениеPreprocess + 331 1 libobjc.A.dylib 0x000000010635f735 objc_exception_throw + 48 2 повышение CoreFoundation 0x00000001087f1015 + [повышение NSException: формат:$ S9Bibimoney15LoginControllerC12loginPressedyyF + 2718 5 APPTEST 0x000000010588f79c $ STA.7 + 28 6 APPTEST 0x00000001058924d4 $ S9Bibimoney9LoginViewC06handleB0yyF + 132 7 APPTEST 0x0000000105892534 $ S9Bibimoney9LoginViewC06handleB0yyFTo + 36 8 UIKitCore 0x000000010c876ecb - [UIApplication сendAction: to: from: forEvent:] + 83 9 UIKitCore 0x000000010c2b20bd - [UIControl sendAction: to: forEvent:] + 67 10 UIKitCore 0x000000010c2b23da - [UIControl _sendActionsForEvents: сEvent:] 0 0 0 00EIC: UIC: UIC: UIC: UIC: UE+ 583 12 UIKitCore 0x000000010c8b20a4 - [UIWindow _sendTouchesForEvent:] + 2729 13 UIKitCore 0x000000010c8b37a0 - [UIWindow SendEvent:] + 4080 14 UIKitCore 0x000000010c891394 - [UIApplication SendEvent:] + 352 15 UIKitCore 0x000000010c9665a9 __dispatchPreprocessedEventFromEventQueue + 3054 16 UIKitCore 0x000000010c9691cb __handleEventQueueInternal + 5948 17 CoreFoundation 0x0000000108756721__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION + 17 18 CoreFoundation 0x0000000108755f93 __CFRunLoopDoSources0 + 243 19 CoreFoundation 0x000000010875063f __CFRunLoopRun + 1263 20 CoreFoundation 0x000000010874fe11 CFRunLoopRunSpecific + 625 21 GraphicsServices 0x000000011047c1dd GSEventRunModal + 62 22 UIKitCore 0x000000010c87581d UIApplicationMain + 14023 APPTEST 0x0000000105896517 main + 71 24 libdyld.dylib 0x0000000108d93575 start + 1 25 ???0x0000000000000001 0x0 + 1) libc ++ abi.dylib: завершается с необработанным исключением типа NSException (lldb)

  • Ожидаемый код состояния 200

1 Ответ

0 голосов
/ 26 января 2019

Я почти уверен, что вы не отправили то, что ожидаете.Как кажется, вы пытаетесь JSON-кодировать строку, которая «уже есть» JSON.Вы должны распечатать содержимое вашего jsonTodo (и вы будете удивлены, сколько вы увидите ...).JSONSerialization будет , вероятно, делать правильные вещи, если вы передадите ему Dictionary, но гораздо быстрее Swifty выполнять такого рода преобразования через JSONDecoder и Codeable протокол.

Вы должны свести свой вопрос к актуальной проблеме, чтобы люди могли помочь.Постарайтесь сконцентрироваться на создании правильного JSON в вашем Data объекте, как только вы получите, что все встанет на свои места.

Чтобы получить конкретный ответ на вашу текущую проблему, вы должны дополнить свой вопрос содержаниемjsonTodo.

...