2017-03-01 6 views
0

Node.jsを実行しているサーバーでJSONオブジェクトを適切な形式で取得する際に問題が発生します。 JSONオブジェクトを受け取ってデータベースに格納するAPIを設定しました。これはpostmanからのPOSTリクエスト(下に示す)を送信すると効果的ですが、iOSから送信すると奇妙なエラーが発生します。例として:Swift 3で適切にJSONオブジェクトをフォーマットする

enter image description here

示す第JSONオブジェクトは、郵便配達から送られてきます。 2番目はiOS(Swift 3を使用)からのものです。

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

私はこのような場合は、なぜ正確にはわからない:エラーは、本質的に言って、サーバーがクラッシュします。私はオブジェクトが作成される方法と関係があると仮定します。これは、私がオブジェクトを作成するために使用している迅速なコードです:

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ボディに追加します。このフィールドは、アプリのUIのテキストフィールドからのもので、私がアンラップして辞書に配置していることに注意してください。私はそれを素早く文字列として印刷すると、正しいフォーマットとして出てきます。実際に私のサーバに送信するときに間違っていることがあります。

EDIT:要求ごとの完全な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

それはあなたがjsonObject AlamoFireにinfoDictionaryを渡し、しないように持っていることだろうか? –

+0

私はAlamoFireを使用していないので、URLリクエスト/ 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") 
関連する問題