使用Swift

时间:2015-06-25 19:40:00

标签: php json swift urlencode url-encoding

当用户尝试使用“&”上传数据时,我一直在努力让网络服务与原生Swift应用程序一起使用性格,等等。

在逃避请求的各种尝试之后,我不知所措并寻求解决此问题的一些建议。我已经从Swift应用程序和PHP脚本中包含了一些代码以供参考。数据可以发布到服务器(我正在使用FileMaker Server PHP API),但不能在“&”时发布由于当PHP命中该字符时JSON被缩短,因此包含在用户提交的值中。

Swift请求示例中的postData参数是JSON格式的字典,使用以下JSONStringify代码进行编码:

func JSONStringify(value: AnyObject, prettyPrinted: Bool = false) -> String {
    let options = NSJSONWritingOptions.PrettyPrinted
    if NSJSONSerialization.isValidJSONObject(value) {
        do {
            let data = try NSJSONSerialization.dataWithJSONObject(value, options: options)
            if let string = NSString(data: data, encoding: NSUTF8StringEncoding) {
                return string as String
            }
        } catch {
            return ""
        }
    }
    return ""
}

快速请求

class func returnAnyObject (phpFile:String, postData:String) -> AnyObject? {
    let server:String = "http://myserver.com"
    let url = NSURL(string: "\(server)\(phpFile)")
    let cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData
    let request = NSMutableURLRequest(URL: url!, cachePolicy: cachePolicy, timeoutInterval: 10.0)
    request.HTTPMethod = "POST"

    // set data
    let dataString = postData.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
    let requestBodyData = (dataString as NSString).dataUsingEncoding(NSUTF8StringEncoding)
    request.HTTPBody = requestBodyData

    var response: NSURLResponse? = nil
    do {
        let reply: NSData = try NSURLConnection.sendSynchronousRequest(request, returningResponse:&response)
        if let results = NSString(data:reply, encoding:NSUTF8StringEncoding) {
            return results
        } else {
            return nil
        }
    } catch {
        return nil
    }
}

PHP

以下是PHP脚本的相关部分。也许我还缺少一些步骤吗?

<?php
    error_reporting(E_ERROR | E_WARNING | E_PARSE);
    $req1 = '../../FileMaker.php';
    $req2 = '../../FM_Connect.php';
    require_once $req1;
    require_once $req2;

    //set fixed variables
    $layout = 'php_Lineitems';

    //Define passed variables
    $json = $_POST['json'];
    $json = stripslashes($json);
    $fieldArray = json_decode($json); // This is now an associative array
?>

1 个答案:

答案 0 :(得分:2)

不要将JSON作为字符串,您不需要对其进行字符串化,应该是NSData类型。

然后直接在请求正文中设置。

关于PHP方面的注意事项,您无法访问$_POST['json']

您需要将代码更改为:

$json = json_decode(file_get_contents('php://input'));