【发布时间】:2016-11-28 22:02:32
【问题描述】:
不知何故,我最终完全停留在应该是一个简单的 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 的数据如下所示:
SyntaxError: Unexpected token 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 不起作用,请尝试查询参数格式)
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 中的所有三个变体都会从服务器生成相同的响应,所以如果特定片段中有什么不正常的地方,那可能是我的匿名化手)
只是为了笑,这是一个 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);
【问题讨论】: