2017-04-03 63 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后端来说也非常适合我。 –