2017-04-03 129 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 Object數組

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 您可以模擬你的消息斯威夫特類,然後再使用這個庫序列化。 這是一塊其中I發佈包含文本數據的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請求並處理響應。我遇到的麻煩是將對象數組轉換爲JSON字符串,該字符串可以作爲參數發送到POST調用。理想情況下,我想使用標準的json_decode()php函數直接在我的服務器上解碼JSON字符串。 – Chipcraft

+0

再次感謝Walter。看起來這可能正是我所尋找的。我正在測試它。謝謝! – Chipcraft

+0

不客氣,這對於php後端來說也非常適合我。 –