【问题标题】:HTTP Post Request API - Parsing JSON wrapped in Single QuotesHTTP Post Request API - 解析包裹在单引号中的 JSON
【发布时间】:2019-01-28 15:56:21
【问题描述】:

我的 API 只接受单引号包裹的 JSON。喜欢:

'{"api_key":"key_api1234","api_secret":"asdfg","uniqueid":"LDM23564GQQP","password":"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()

我收到 500 错误

【问题讨论】:

  • 邮政编码作为代码,而不是图像
  • 转换成 JSON,然后给自己加上单引号怎么样?
  • 顺便说一句,这是一个糟糕的 API,原因如下: 1. 声称它接受 json,但需要一个不是有效 json 的字符串 2. 不返回正确的错误代码
  • @larme 是的,看看我的回答,我努力做到了。
  • @mag_zbc 我同意。

标签: json swift dictionary encoding json-serialization


【解决方案1】:

这是一个糟糕的设计 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"}'

【讨论】:

  • 完全同意。我将会。帮我很多。谢谢
【解决方案2】:

在字符串中插入单引号并将其转换为数据。

问题解决了:

    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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 2019-10-22
    相关资源
    最近更新 更多