2017-03-01 125 views
0

我在运行Node.js的服务器上以正确格式获取我的JSON对象时出现问题。我的API设置为接收JSON对象并将其存储在数据库中。当我向postman发送一个POST请求(如下所示)时,这很好用,但是当我从iOS发送它时会引发奇怪的错误。作为一个例子:正确地格式化Swift 3中的JSON对象

enter image description here

示出的第一JSON对象从邮递员发送。第二个来自iOS(使用Swift 3)。该错误基本上崩溃的服务器,说:

AssertionError: Error: key   {"firstname":"testFirstName","lastname":"testLastName","email":"[email protected]","username":"testusername123", == null 

我不完全确定为什么是这种情况。我认为它与创建对象的方式有关?这是SWIFT代码我使用创建的对象:

let infoDictionary = [ 
      "username": UserNameField.text!, 
      "password": PasswordField.text!, 
      "firstname": FirstNameField.text!, 
      "lastname": LastNameField.text!, 
      "email":  EmailField.text! 
     ] 

     // Whole block = send above dictionary as JSON to server: 
     if JSONSerialization.isValidJSONObject(infoDictionary) { 
      do { 
       let jsonObject = try JSONSerialization.data(withJSONObject: infoDictionary, 
                  options: .prettyPrinted) 

我然后它添加到HTTP主体。请注意,这些字段来自应用程序界面中的文本字段,我将其展开并放入字典中。当我以快捷方式将它打印成字符串时,它会以正确的格式显示出来,当我真正将它发送到我的服务器时,出现了问题。

编辑:每请求的完整URL请求如下:

do { 
       let jsonObject = try JSONSerialization.data(withJSONObject: infoDictionary, 
                  options: .prettyPrinted) 
       // Create Post request 
       let url = URL(string: "websiteurl") 
       var request = URLRequest(url: url!) 
       request.httpMethod = "POST" 

       // Append JSON object 
       request.httpBody = jsonObject 

       // Send request 
       let task = URLSession.shared.dataTask(with: request) { data, response, error in 
        guard let data = data, error == nil else { 
         print(error?.localizedDescription ?? "No Data") 
         return 
        } 
        let responseJSON = try? JSONSerialization.jsonObject(with: data, options: []) 
        if let responseJSON = responseJSON as? [String: Any] { 
         print(responseJSON) 
        } 
       } 
       task.resume() // Sends the request 
      } catch { 
       print(error.localizedDescription) 
      } 
     } 
+0

难道说你到infoDictionary传递给AlamoFire,而不是把JSONObject? –

+0

我没有使用AlamoFire,使用URLRequest/URLSession手动创建HTTP请求。所以我使用URLRequest创建请求,然后将json对象添加到该请求的主体中。 –

+0

对不起!我以为我曾经在某处读过“AlamoFire” - 不知道为什么。但无论如何:显然你的jsonObject被包装成另一个JSON字符串。请添加代码如何创建URLRequest。 –

回答

1

的请求主体是好的,它包含一个有效的JSON对象,但 显然服务器会把HTTP身体和包装纸 它变成另一个JSON对象。请注意,“text/plain”是HTTP请求的默认 内容类型(https://tools.ietf.org/html/rfc2045#section-5.2)。

的解决方案是明确设置内容类型:

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