2017-04-03 11 views
0

私はswift/php/sqlを3ヶ月間書いています...(私は新人です。私は単純なPOST文字列を作成し、http要求などを発行することができます。
私のデータベースに追加するために、複数のオブジェクトをサーバーにプッシュしようとしています。だから私はオブジェクトを輸送する最善の方法は大きなjson文字列を使用することだと思っている。たぶん... idk。投稿する複数のオブジェクトjson文字列を作成するのに失敗しました。理想的には、PHP json_decode($ myJsonString)が直接デコードする文字列が必要です...私はテストケースとして使用するための遊び場を作成しました。 JSON(myPlaceArray)の呼び出しは「不明」になります。
これを解決する方法と簡単な方法をお勧めします。ありがとうございました!Swift Object Array to JSON - > POST - > PHP json_decode()からPHPオブジェクトへの配列

import UIKit 
import SwiftyJSON 
class myClass { 

    public struct Place { 
    var PlaceId = String() 
    var name  = String() 
    var address = String() 
    var latitude = Double() 
    var longitude = Double() 
    } 

} 

var myPlaceArray = [myClass.Place()] 
var myPlace = myClass.Place() 

for i in 0..<3 { 
    myPlace.PlaceId = "\(i)" 
    myPlace.address = "My Address \(i)" 
    myPlace.name = "My Name \(i)" 
    myPlace.latitude = 37.123 
    myPlace.longitude = -127.321 
    if(i==0){ 
    myPlaceArray[0] = myPlace 
    } 
    else { 
    myPlaceArray.append(myPlace) 
    } 
} 
print(myPlaceArray[0]) 

let json = JSON(myPlaceArray) 
print(json) // results: "unknown" 

let jsonMyPlaceArray = JSON(myPlaceArray) 
print(jsonMyPlaceArray) 

//setup json post data 

//send HTTP POST 
let myUrl = NSURL(string: "https://myUrl.php") 
let request = NSMutableURLRequest(url: myUrl! as URL) 
request.httpMethod = "POST" 
let postString = "jsonPlaces=\(String(describing: jsonMyPlaceArray))" 

print(postString) // jsonPlaces=unknown 

//.... make request 

playground_image

答えて

0

私はJSONUtils非常に有用であることが判明: https://github.com/peheje/JsonSerializerSwift はあなたがあなたのメッセージとしてスウィフトのクラスをモデル化し、後でこのライブラリを使用してそれらをシリアライズすることができます。 これは私がテキストデータと符号化された画像を含むJSONメッセージをポストコードの一部である:

クラスTeamsSao:BaseSao {

class func update (request : TeamUpdateRequest, callback : @escaping (TeamUpdateResponse!) -> Void) { 

    var strUrl : String = getServiceUrl() + "/index.php" 
    strUrl += "?avoid_cache=" + StringUtils.randomString (length: 24) 

    let url: URL = URL(string: strUrl)! 

    var urlRequest: URLRequest = URLRequest(url: url) 

    urlRequest.httpMethod = "POST" 
    urlRequest.timeoutInterval = 120000 
    urlRequest.cachePolicy = .reloadIgnoringLocalCacheData 

    urlRequest.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 

    urlRequest.setValue("application/json", forHTTPHeaderField: "Accept") 

    let bodyStr:String = "msg=" + JSONUtils.toJson(request)//"pseudo=test" 
    urlRequest.httpBody = bodyStr.data(using: String.Encoding.utf8) 

    let session = URLSession.shared 

    session.dataTask(with: urlRequest, completionHandler: 
     { (data, response, error) in 

      //print(data) 
      //print(response) 
      //print(error) 

      var result : TeamUpdateResponse! 

      if (error == nil) { 
       if let httpResponse = response as? HTTPURLResponse { 
        if (httpResponse.statusCode < 200) || (httpResponse.statusCode >= 300) { 
         result = TeamUpdateResponse() 
         result.status = TeamUpdateResponse.RESULT_EXCEPTION 
         result.errorDescription = "Response Status: \(httpResponse.statusCode)" 
        } else { 
         result = TeamUpdateParser.parse(data: data!) 
        } 
       } 

      } else { 
       //print("A connection error occurred, here are the details:\n \(error)") 
       result = TeamUpdateResponse() 
       result.status = TeamUpdateResponse.RESULT_EXCEPTION 
       result.errorDescription = error as! String! 
      } 
      callback (result) 
    } 
     ).resume() 

} 

}

理解するいくつかのポイント:

  1. TeamUpdateRequest
  2. TeamUpdateResponseを送信するために、データを含むクラスがあるさ応答を含むクラス
  3. Swift 3では、コールバック関数を使用する必要があります。このメソッドはコールバック関数を受け取るので、投稿が完了すると応答が解析され、コールバックが呼び出されます。
+0

ウォルターありがとうございます。私はURLリクエストを設定し、レスポンスを処理することができます。私が問題を抱えているのは、オブジェクト配列をPOST呼び出しのパラメータとして送信できるJSON文字列に変換することです。理想的には、標準のjson_decode()PHP関数を使用してJSON文字列を自分のサーバー上で直接デコードする必要があります。 – Chipcraft

+0

ウォルターに感謝します。これはちょうど私が探していたものかもしれないように見えます。私は今それをテストしています。ありがとう! – Chipcraft

+0

あなたは歓迎します、これはPHPバックエンドでも私にとって完璧に機能しました。 –