php - 快速发送 json 到 php 服务器

标签 php json swift

我查阅了很多资料并使用了很多方法将 json 数据发送到 php 服务器。首先,我创建 singleORder 的顺序并将其收集在 arrayOfOrders 中:

func createOrderInArray(){

    var savedDataHourly: NSDictionary
    var savedDataTransfer:NSDictionary
    var savedDataReis: NSDictionary
    var singleOrderClass = Order()
    //localArrayOfOrder = []

    singleOrderClass.type_id = singleStructDataOfCar.typeID
    singleOrderClass.model_id = singleStructDataOfCar.modelID

    // loading hourly
    if Load.dictionary("ServiceByHours") != nil {
         savedDataHourly = Load.dictionary("ServiceByHours")
        println("loading hourly")
        singleOrderClass.hourly.addressOfRequest = savedDataHourly["ServiceByHoursAddressOFRequest"] as String
        singleOrderClass.hourly.addressOfDelivery = savedDataHourly["ServiceByHoursAddressOfDelivery"] as String
        singleOrderClass.hourly.detailedText = savedDataHourly["ServiceByHoursDetailText"] as String
        singleOrderClass.hourly.startofWork = savedDataHourly["StartDate"] as String
        singleOrderClass.hourly.endOfWork = savedDataHourly["EndDate"] as String
        singleOrderClass.hourly.undefinedTime = savedDataHourly["undefinedTime"] as String

    }else{
        println("hourly is empty")
        singleOrderClass.hourly.addressOfRequest = ""
        singleOrderClass.hourly.addressOfDelivery = ""
        singleOrderClass.hourly.detailedText = ""
        singleOrderClass.hourly.startofWork = ""
        singleOrderClass.hourly.endOfWork = ""
        singleOrderClass.hourly.undefinedTime = ""
    }
    // loading transfer
    if Load.dictionary("ServiceByTransfer") != nil {
        savedDataTransfer = Load.dictionary("ServiceByTransfer")
        singleOrderClass.transfer.startofWork = savedDataTransfer["ServiceDataStartDate"] as String
        singleOrderClass.transfer.addressOfRequest = savedDataTransfer["ServiceDataAddressOfReq"] as String
        singleOrderClass.transfer.addressOfDelivery = savedDataTransfer["ServiceDataAddressOfDel"] as String
        singleOrderClass.transfer.detailedText = savedDataTransfer["ServiceDataDetailedText"] as String

    }else{
        singleOrderClass.transfer.startofWork = ""
        singleOrderClass.transfer.addressOfRequest = ""
        singleOrderClass.transfer.addressOfDelivery = ""
        singleOrderClass.transfer.detailedText = ""
    }
    // loading reis
    if Load.dictionary("ServiceByReis") != nil {
        savedDataReis = Load.dictionary("ServiceByReis")
        singleOrderClass.custom.startofWork = savedDataReis["ServiceDataStartDate"] as String
        singleOrderClass.custom.addressOfRequest = savedDataReis["ServiceDataAddressOfReq"] as String
        singleOrderClass.custom.addressOfDelivery = savedDataReis["ServiceDataAddressOfDel"] as String
        singleOrderClass.custom.detailedText = savedDataReis["ServiceDataDetailedText"] as String
        singleOrderClass.custom.priceProposed = savedDataReis["ServiceDataPrice"] as String
    }else{
        singleOrderClass.custom.startofWork = ""
        singleOrderClass.custom.addressOfRequest = ""
        singleOrderClass.custom.addressOfDelivery = ""
        singleOrderClass.custom.detailedText = ""
        singleOrderClass.custom.priceProposed = ""
    }

    // add this single order to array

    arrayOfOrders.append(singleOrderClass)

}

我只是将所有订单收集到一个数组中。下一步是将数组中的所有数据转换为字典,以便我可以将其序列化为 json 格式:

func createJsonFromArrayToDict(orders: [Order])->[AnyObject]{

    //as Dictionary<String, String>
    var dictOfOrders: [AnyObject] = []
    var counter = 0

    for singleOrder in orders {
        counter = counter + 1
        println("COUNTER: \(counter)")

        var dicOfOrder = [
            "type_id": singleOrder.type_id,
            "model_id": singleOrder.model_id,
            "transfer": [
                "StartDate": singleOrder.transfer.startofWork,
                "StartPoint": singleOrder.transfer.addressOfRequest,
                "EndPoint": singleOrder.transfer.addressOfDelivery,
                "CommentText": singleOrder.transfer.detailedText
            ],
            "hourly": [
                "StartDate": singleOrder.hourly.startofWork,
                "EndDate": singleOrder.hourly.endOfWork,
                "StartPoint": singleOrder.hourly.addressOfRequest,
                "EndPoint": singleOrder.hourly.addressOfDelivery,
                "CommentText": singleOrder.hourly.detailedText,
                "Undefined_Time": singleOrder.hourly.undefinedTime
            ],
            "custom":[
                "StartDate": singleOrder.custom.startofWork,
                "StartPoint": singleOrder.custom.addressOfRequest,
                "EndPoint": singleOrder.custom.addressOfDelivery,
                "CommentText": singleOrder.custom.detailedText,
                "customPrice": singleOrder.custom.priceProposed
            ],
            "device_name": "ios_device"
        ]
        // check if it is not the same order as previous (need to include this in future)
        dictOfOrders.append(dicOfOrder)

    }

    return dictOfOrders
}

现在我使用这个函数将这个 JSON 发送到服务器:

func sendJsonToServer(OrderList: AnyObject){
var request = NSMutableURLRequest(URL: NSURL(string: "osc.kz/ru/test")!)

    var session = NSURLSession.sharedSession()
    request.HTTPMethod = "POST"

    var err: NSError?
if let serializedData = NSJSONSerialization.dataWithJSONObject(OrderList, options: nil, error: &err){
    request.HTTPBody = serializedData
    println(request.HTTPBody)
    }

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


    var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
        println("Response: \(response)")
        var strData = NSString(data: data, encoding: NSUTF8StringEncoding)
        println("Body: \(strData)")
        var err: NSError?
        var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error: &err) as NSArray
        // var json = noWrappedJson!
        // Did the JSONObjectWithData constructor return an error? If so, log the error to the console
        if(err != nil) {
            println(err!.localizedDescription)
            let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding)
            println("Error could not parse JSON: '\(jsonStr)'")
        }
        else {
            // The JSONObjectWithData constructor didn't return an error. But, we should still
            // check and make sure that json has a value using optional binding.
            for singleCode in json {
                if let parseJSON = singleCode as? NSDictionary {
                    // Okay, the parsedJSON is here, let's get the value for 'success' out of it
                    var success = parseJSON["code"] as? String
                    println("Succes: \(success)")
                }
                else {
                    // Woa, okay the json object was nil, something went worng. Maybe the server isn't running?
                    let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding)
                    println("Error could not parse JSON: \(jsonStr)")
                }
            }
        }

    })

    task.resume()
}

但是,我的服务器正在获取空数组 []。我不明白为什么我要发送空值。在发送请求之前,我打印了 request.httpbody。它有一个值,但服务器得到 [] 。任何建议表示赞赏!

服务器端在 PHP 上:

<?php
 if ($_REQUEST)
{   $_ARR = $_REQUEST;
$OrderList = $_ARR['OrderList'];
foreach($OrderList as $order){
 $auto_type_id = $order['type_id'];


$auto_model_id = $order['model_id'];



$device_name = $order['device_name'];
   $commentText = $order['commentText'];


 $transfer = '';
   $hourly = '';
   $custom = '';
   if (!empty($order['transfer'])) {
    $transfer = $order['transfer'];
    $db->query("insert into table_test_android set json_text = 'transfer' ");
    $db->query("insert into table_test_android set json_text = 'type:".$auto_type_id.",model_id:".$auto_model_id.",device:".$device_name."' ");
   }
   if (!empty($order['hourly'])) {
    $hourly = $order['hourly'];
    $db->query("insert into table_test_android set json_text = 'hourly' ");
    $db->query("insert into table_test_android set json_text = 'type:".$auto_type_id.",model_id:".$auto_model_id.",device:".$device_name."' ");
   }
   if (!empty($order['custom'])) {
    $custom = $order['custom'];
    $db->query("insert into table_test_android set json_text = 'custom' ");
    $db->query("insert into table_test_android set json_text = 'type:".$auto_type_id.",model_id:".$auto_model_id.",device:".$device_name."' ");
   }

  }

  $db->query("insert into table_test_android set json_text = '".json_encode($_ARR)."'");
  $code_my = mt_rand(100000, 999999);
  $code[] = array('code'=>(string)$code_my);echo json_encode($code);
 }

最佳答案

如果您要发送 json 数据,则不会填充 phps superglobals - 要访问您需要访问原始输入流的 json:

$json = file_get_contents('php://input');
//echo $json shoulkd show the json string

$array = json_decode($json, true);
// var_dump($arr) should show the array structure

$OrderList = $array['OrderList'];
//provided your json is structured correctly everything else should work from here on

编辑您可能还有许多其他问题,首先您的 sql 是错误的 - INSERT 语法看起来像 'INSTERT into tablename (colname, anothercolname) VALUES (val,val);' 而你有一个奇怪的插入/更新混搭,但这超出了这个问题的范围(如何将 json 数据发送到服务器)

关于php - 快速发送 json 到 php 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29559033/

相关文章:

python - 安全地从 json 获取嵌套列表索引?

php - 使用 CURL 将 JSON 与 PHP 变量一起发布

java - 如果一个字段的类型未知,Jackson 如何解析 JSON 对象

ios - UIView 使用自动布局调整大小但在运行时获取其帧大小不正确 ios

php - 奇怪的 PHP 自动加载问题

javascript - 创建了查询,需要数据在下拉列表中显示

php - 为什么这个字符串回显 0?

ios - Swift 2 iOS 9 可用性全局变量

swift - iOS : WKWebView Does Not Display SVG

php - 什么会影响我的代码以获得巨大的字体大小变化?