【问题标题】:POST w/ JSON Body - Swift3 - fragments?POST with/ JSON Body - Swift 3 - 片段?
【发布时间】:2017-02-18 08:50:12
【问题描述】:

我只是想通过 Swift3 httprequest 发送一个 JSON 字符串。

尝试使用字典和转义字符串 ...

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 的:/

不知道该怎么办!

【问题讨论】:

    标签: ios json post httprequest swift3


    【解决方案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")
      }
    

    【讨论】:

    • 嗯,我正在使用 Node.JS 服务器(Hapi 框架)并且正在控制台记录 request.payload,我看到了我正在传递的内容,但它奇怪地嵌套了,所以我可以't parse it ... request.payload = { ' {"username": "theusername"} ' : ' ' } ... 好像我的json嵌套在单引号中,但也是一些下一个字典的键
    • 我必须添加 ... request.setValue("application/json", forHTTPHeaderField: "Content-Type") ... 一切都很好,非常感谢您的帮助! !感恩节快乐!!! :)
    • 如果您将 options: .prettyPrinted 替换为 options: [] 是否还会发生
    • 通过调试,我做的第一件事就是删除 .prettyPrinted for [] ...正如我在我的 request.payload 中看到的 \n ...所以“是”是您问题的答案...我现在将使用 .prettyPrinted 进行测试 ...正在加载 ...两者都可以工作 ...虽然需要设置标头 ...我不是服务器/api专家,但有没有办法为服务器期待json?因为忘记设置 application/json 对我来说是一个常见的问题:S
    猜你喜欢
    • 2022-11-28
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 2015-09-16
    • 1970-01-01
    相关资源
    最近更新 更多