Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Swift在POST请求中向PHP提交正确转义的JSON_Php_Json_Swift_Urlencode_Url Encoding - Fatal编程技术网

使用Swift在POST请求中向PHP提交正确转义的JSON

使用Swift在POST请求中向PHP提交正确转义的JSON,php,json,swift,urlencode,url-encoding,Php,Json,Swift,Urlencode,Url Encoding,当用户试图使用“&”等字符上传数据时,我一直在努力让web服务与本机Swift应用程序一起工作 在多次试图逃避请求后,我不知所措,并在寻找解决此问题的建议。我已经包含了一些来自Swift应用程序和PHP脚本的代码,以供参考。数据可以发布到服务器(我使用的是FileMaker服务器PHP API),但当用户提交的值中包含“&”时,数据就不能发布到服务器,因为当PHP点击该字符时,JSON会被截断 Swift请求示例中的postData参数是一个JSON格式的字典,它使用以下来自JSONString

当用户试图使用“&”等字符上传数据时,我一直在努力让web服务与本机Swift应用程序一起工作

在多次试图逃避请求后,我不知所措,并在寻找解决此问题的建议。我已经包含了一些来自Swift应用程序和PHP脚本的代码,以供参考。数据可以发布到服务器(我使用的是FileMaker服务器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 ""
}
Swift请求

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
?>

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

然后直接在请求主体中设置

注意:在PHP端,您将无法访问
$\u POST['json']

您需要将代码更改为:

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

我同意meda的观点:如果你要发布JSON,那么只需发布JSON,并完全消除这个百分比转义的东西,更不用说JSON从
NSData
String
的往返了。如果您确实觉得有必要将此JSON放在
应用程序/x-www-form-urlencoded
请求中,那么
stringbyaddingpercentescapesusingencode
就不能胜任这项工作,因为它会让ampersands不被替换。请参阅,以获得正确逃逸的替代方案。但是直接发布JSON(没有任何百分比转义)是一种更干净的方法。使用
echo
进行测试,它将在$json行之前回显一行,但不会在$json行之后运行或抛出错误。PHP文件还需要知道什么吗?在Swift端,我正在设置
request.HTTPMethod=“POST
并执行此操作
let requestBodyData=try!NSJSONSerialization.dataWithJSONObject(postDict,选项:NSJSONWritingOptions(rawValue:0))request.HTTPBody=requestBodyData
您可以在编码之前尝试var\u dump,还可以尝试打开错误报告明白了!将
$json
的定义更改为
$json=file\u get\u contents('php://input“);
,删除
$json_decode()
part.谢谢!哦,我看到我的打字错误了,我的意思是$json将是解码数据,祝你好运