【问题标题】:Submitting properly escaped JSON to PHP in a POST request with Swift使用 Swift 在 POST 请求中将正确转义的 JSON 提交给 PHP
【发布时间】:2015-06-25 19:39:59
【问题描述】:

当用户尝试使用“&”字符等上传数据时,我一直在努力让 Web 服务与原生 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
?>

【问题讨论】:

  • 我同意 meda:如果您要发布 JSON,则只需发布 JSON,并完全消除这种百分比转义的东西,更不用说将 JSON 从NSData 往返String 并返回。如果您真的觉得有必要将此 JSON 放入 application/x-www-form-urlencoded 请求中,那么 stringByAddingPercentEscapesUsingEncoding 就无法胜任这项工作,因为它会让 & 符号无法转义。请参阅stackoverflow.com/a/25154803/1271826 以获取正确百分比转义的替代方法。但是直接发布 JSON(没有任何百分比转义)是更清洁的方法。

标签: php json swift urlencode url-encoding


【解决方案1】:

不要把JSON作为字符串,你不需要把它字符串化,应该是NSData类型的。

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

请注意,在 PHP 端,您将无法访问 $_POST['json']

您需要将代码更改为:

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

【讨论】:

  • 执行此操作后,PHP 脚本会在您建议添加的 JSON 行处停止。使用echo 进行测试,它会在 $json 行之前回显一行,但之后不会运行或抛出错误。 PHP文件还有什么需要知道的吗?在 Swift 方面,我正在设置 request.HTTPMethod = "POST 并执行此操作 let requestBodyData = try! NSJSONSerialization.dataWithJSONObject(postDict, options: NSJSONWritingOptions(rawValue:0)) request.HTTPBody = requestBodyData
  • 编码前可以尝试var_dump,也可以尝试开启报错
  • 知道了!将$json 的定义更改为$json = file_get_contents('php://input');,删除$json_decode() 部分。谢谢!
  • 哦,我看到我的错字了,我的意思是 $json 将是解码后的数据,祝你好运
猜你喜欢
  • 1970-01-01
  • 2018-08-16
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 2018-01-10
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多