Swift REST POST丢失报价?

时间:2016-11-28 22:02:32

标签: ios json rest swift3

不知怎的,我最终完全陷入了一个简单的REST调用。我有一个宁静的服务(在节点中)期待一个字符串数组。每次我调用看似有效的参数时,我都会从服务器收到一个错误,看起来它试图将字符串解析为整数,这让我觉得它在字符串的某处丢失了引号。

这是原始的Swift(3)代码(最后还有两个变体)。 " ID"和" parmvalue"被传递给这个函数。

let url = URL(string: "\(root)path/\(id)/myendpoint")
var request = URLRequest(url:url!)
request.httpMethod = "POST"
request.addValue("application/json",forHTTPHeaderField: "Content-Type")
let params = [ "parm" : [ parmvalue ] ]
do {
    let jsonParams = try JSONSerialization.data(withJSONObject: params)
    request.httpBody = jsonParams
    let task = URLSession.shared.dataTask(with: request, completionHandler: {(data, response, error) -> Void in
...etc

这是服务器代码:

    app.post('/path/:id/myendpoint', globals.authentication, function(req, res){
        var param = JSON.parse(req.param('parm', "[]"));
        var Id = req.param('id', -1);
...etc

传入parmvalue =" 898e1ac8-4892-4e6e-89cb-4b2ea9306f75.jpg",我从服务器得到500响应,传递给dataTask的completionHandler的数据如下: / p>

  

SyntaxError:意外的标记e

和一个指向右边的堆栈跟踪" var param"线。返回的意外标记几乎总是对应于guid中的第一个非数字值。

这是变体1(只是硬编码json,它不复杂)

let url = URL(string: "\(root)path/\(id)/myendpoint")
var request = URLRequest(url:url!)
request.httpMethod = "POST"
request.addValue("application/json",forHTTPHeaderField: "Content-Type")
let testparamsString = "{ \"photos\" : [ \"\(filename)\" ] }"
let testparams = testparamsString.data(using: .utf8)
request.httpBody = testparams
...etc

这里是变体2(如果json没有工作,请尝试查询param格式)

let url = URL(string: "\(root)path/\(id)/myendpoint")
var request = URLRequest(url:url!)
request.httpMethod = "POST"
let queryparams = "parm[]=\(filename.stringByAddingPercentEncodingForFormUrlencoded()!)"
request.httpBody = queryparams.data(using: .utf8)

(请注意,所有代码片段都在某种程度上对变量名称和值进行了匿名处理,Swift中的所有三个变体都会从服务器生成相同的响应,因此如果某个特定片段中存在某些问题,那么它和#39;可能是我的手工匿名)

只是为了咧嘴笑,这里也是C#应用程序的一部分,它也调用了这个端点(使用RestSharp库)并且工作正常 - 所以我非常相信服务器代码是正确的:

var request = new RestRequest($"/path/{id}/myendpoint", Method.POST);
var parmArray = new JArray();
parmArray.Add(parmvalue);
var jsonParms = JsonConvert.SerializeObject(parmArray, Formatting.None);
request.AddParameter("parm", jsonParms);

1 个答案:

答案 0 :(得分:0)

变体1很接近,但它需要一个额外的(转义)反斜杠来保留那些引号。这就是我最终的结果:

    let url = URL(string: "\(root)path/\(id)/myendpoint")
    var request = URLRequest(url:url!)
    request.httpMethod = "POST"
    request.addValue("application/json",forHTTPHeaderField: "Content-Type")
    let paramsString = "{ \"photos\" : \"[\\\"\(filename)\\\"]\" }"
    request.httpBody = paramsString.data(using: .utf8)