API HTTP Post Request - анализ JSON, заключенный в одинарные кавычки - PullRequest
0 голосов
/ 28 января 2019

Мой API принимает только одинарную кавычку в JSON.Например:

'{"api_key": "key_api1234", "api_secret": "asdfg", "uniqueid": "LDM23564GQQP", "пароль": "test1", "pin": "94729 "} '

Я не смог найти точного ответа ни здесь, ни в Интернете.

Я перепробовал много синтаксических изменений в JSON.

let parameters = ["api_key": "key_api1234",
                      "api_secret": "asdfg",
                      "uniqueid": "LDM23564GQQP",
                      "password": "test1",
                      "pin": "94729"]

    guard let url = URL(string: "https://dev-api.authenticateuser") else { return }
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    guard let httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: []) else { return }
    request.httpBody = httpBody

    let session = URLSession.shared
    session.dataTask(with: request) { (data, response, error) in
        if let response = response {
            print(response)
        }

        if let data = data {
            do {
                let json = try JSONSerialization.jsonObject(with: data, options: [])
                print(json)
            } catch {
                print(error)
            }
        }

        }.resume()

Iполучаю 500 Ошибка

Ответы [ 2 ]

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

Это плохой дизайн API.Вынуждая встраивать JSON в одинарные кавычки, я бы посоветовал, если вы не можете указать внутреннему разработчику исправить это.

Тем не менее, если вы хотите, чтобы он работал, вы можете просто преобразовать одинарные кавычки в Data, и то, что вы назвали httpBody, добавьте эту одинарную кавычку до и после.

При плохой практике с принудительным развёртыванием (использование !), но чтобы подчеркнуть логику:

let parameters = ["api_key": "key_api1234",
                  "api_secret": "asdfg",
                  "uniqueid": "LDM23564GQQP",
                  "password": "test1",
                  "pin": "94729"]

var request = URLRequest(url: URL(string: "www.stackoverflow.com")!)

let singleQuote = "'".data(using: .utf8)!
let parametersJSON = try! JSONSerialization.data(withJSONObject: parameters, options: [])

let finalBody = singleQuote + parametersJSON + singleQuote
print("request.httpBody string: \(String(data: finalBody, encoding: .utf8)!)")
request.httpBody = finalBody

Вывод:

$>request.httpBody string: '{"api_key":"key_api1234","uniqueid":"LDM23564GQQP","pin":"94729","password":"test1","api_secret":"asdfg"}'
0 голосов
/ 28 января 2019

Вставьте одинарные кавычки внутри строки и преобразуйте ее в данные.

Проблема решена:

    guard let url = URL(string: "https://dev-api.authenticateuser") else { return }
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("*/*", forHTTPHeaderField: "Accept")
    let jsonData = "'{\"api_secret\":\"asdfg\",\"uniqueid\":\"LDM23564GQQP\",\"pin\":\"94729\",\"password\":\"test1\",\"api_key\":\"key_api1234\"}'".data(using: .utf8)

    request.httpBody = jsonData
    let session = URLSession.shared
    session.dataTask(with: request) { (data, response, error) in
        if let response = response {
            print(response)
        }

        if let data = data {
            do {
                let json = try JSONSerialization.jsonObject(with: data, options: [])
                print(json)
            } catch {
                print(error)
            }
        }

    }.resume()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...