【问题标题】:swift - how to get JSON response from serverswift - 如何从服务器获取 JSON 响应
【发布时间】:2019-02-03 23:38:21
【问题描述】:

我正在将此数据发送到服务器,我希望它做出响应。尝试了这段代码,但它不起作用。

    let parameters = [ "imie" : (imie), "nazwisko" : (nazwisko), "telefon" : (telefon), "adres" : (adres), "miasto" : (miasto), "kod" : (kod), /*"powiat" : (powiat), "wojewodztwo" : (wojewodztwo),*/ "opis" : (selectedvalue)   ]


    let url = URL(string: "http://www.hetman.pl/post1.php")!
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.setValue("application/json", forHTTPHeaderField: "Accept")
    request.setValue("application/x-www-form-urlencoded; charset=utf-8", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.setBodyContent(parameters)

    let task = URLSession.shared.dataTask(with: request as URLRequest) { data, response, error in
        if error != nil{
            return
        }

        do{
            let t = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject]
            print(t as? String)
        } catch{
            print("Error 43 -> \(error)")
        }


    }

请求正确,服务器正在正确处理数据,但响应给我这个错误:

Error 43 -> Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 3." UserInfo={NSDebugDescription=Invalid value around character 3.}

所以问题是,我如何从服务器取回数据?

【问题讨论】:

  • 你能显示打印的t - 你的JSON吗?
  • print(t as? String) 这应该可行吗?我不这么认为。您应该得到“从 '[String : AnyObject]' 转换为不相关的类型 'String' 总是失败”(也不要在 Swift 4 中使用 AnyObject)。相反,let responseString = String(data: data, encoding: .utf8); print("responseString: \(responseString)")request as URLRequest 也应该没用。
  • 可以分享一下邮递员的收藏吗?
  • 可能是您的 json 格式不正确。通过邮递员验证。

标签: ios json swift swift4 urlsession


【解决方案1】:

为什么会有内容类型?

// code 3840, data.length = 1 byte, so empty and no error
  1. request.setValue("application/x-www-form-urlencoded; charset=utf-8", forHTTPHeaderField: "Content-Type")

  2. request.addValue("application/json", forHTTPHeaderField: "Content-Type")

删除第一个内容类型标题字段并仅尝试:

request.addValue("application/json", forHTTPHeaderField: "Content-Type")

【讨论】:

    【解决方案2】:

    请检查来自此 url 的响应是否仅为 JSON。您可能会收到 XML 或字符串响应。

    如果您收到 String 响应,请尝试以下行:

    let stringResponse = String(data: data!, encoding: String.Encoding.utf8) as String!
    

    如果您收到 XML 响应,请尝试以下行:

    let xmlDictionary = try XMLSerialization.xmlObject(with: data!) as? [String: Any]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多