2016-11-28 6 views
0

どうにかして、簡単なREST呼び出しが何であるべきかを完全に突き止めました。私は文字列の配列を期待している(ノード内の)安らかなサービスを持っています。私が有効なパラメータと思われるものを呼び出すたびに、文字列をパースして整数型として解析しようとしていたようなエラーがサーバーから発生し、文字列のどこかで引用符が失われていると考えられます。早送りREST POSTで引用符が失われましたか?

ここには元のSwift(3)コード(最後に2つの亜種があります)があります。 "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 

ここでは、サーバーのコードです:= "898e1ac8-4892-4e6e-89cb-4b2ea9306f75.jpg" parmvalueに渡す

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

が、私は、サーバーからの500応答を取得し、データ

SyntaxError: Unexpected token e

とその「VaRのPARAM」の行で右を向いスタックトレース:dataTaskためcompletionHandlerに渡さは次のようになります。ほとんどの場合、返される予期しないトークンは、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の3つのバリエーションはすべて同じ応答をサーバーから生成するため、特定の断片に何か不具合がある場合は、手)

0123ただ、にやにや笑いのため

は、ここにも、このエンドポイント(RestSharpライブラリを使用して)を呼び出し、作品C#のアプリの一部です - ので、私は、サーバーコードが正しいことを、かなり信頼:1が近い

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); 

答えて

0

バリアントましたしかし、そこに引用符を残すためには、余分な(エスケープされた)バックスラッシュが必要でした。ここで私は結局何をしたのですか:

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) 
関連する問題