在带有 Swift 的 POST 请求中提交正确转义的 JSON 到 PHP
Submitting properly escaped JSON to PHP in a POST request with Swift
当用户尝试使用“&”字符等上传数据时,我一直在努力让 Web 服务与本机 Swift 应用程序一起工作。
在尝试逃避请求后,我不知所措,正在寻找解决此问题的建议。我已经包含了一些来自 Swift 应用程序和 PHP 脚本的代码以供参考。数据可以发布到服务器(我使用的是 FileMaker Server PHP API),但当“&”作为 JSON 包含在用户提交的值中时则不能当 PHP 击中该字符时被缩短。
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 端您将无法访问 $_POST['json']
。
您需要将代码更改为:
$json = json_decode(file_get_contents('php://input'));
当用户尝试使用“&”字符等上传数据时,我一直在努力让 Web 服务与本机 Swift 应用程序一起工作。
在尝试逃避请求后,我不知所措,正在寻找解决此问题的建议。我已经包含了一些来自 Swift 应用程序和 PHP 脚本的代码以供参考。数据可以发布到服务器(我使用的是 FileMaker Server PHP API),但当“&”作为 JSON 包含在用户提交的值中时则不能当 PHP 击中该字符时被缩短。
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 端您将无法访问 $_POST['json']
。
您需要将代码更改为:
$json = json_decode(file_get_contents('php://input'));