これは私の最初の質問です。ありがとう!HTTP GETリクエストでクラウドファンクション節エラーが発生しました
私は、Bluemix Cloudantアカウントに、特性の異なる車を使っていくつかの文書を定義しました。私は、IOS Swiftフロントエンドアプリケーションから1つのエントリを取得したいと思います。
これは、例えばクエリURLです: ます。https:?//$ACCOUNT-bluemix.cloudant.com/cars/_design/car_index/_search/car_index_name Q =サイズ:今すぐ小さな
問題:私の場合ブラウザでこのURLを使用するJSON形式の正しい結果がエラーなく返されます。しかし、アプリケーションがリクエストを作成すると、関数自体はエラーが記録されますが、リクエスト自体は成功したようです。
function_clauseエラーは、Javascript Cloudantがドキュメントのインデックスを作成する際にいくつかのバグが原因で発生することがあります。私が使用しているJavascriptは、Cloudantがチュートリアルで述べているのとまったく同じです。
ブラウザでは動作しますが、アプリケーションでは動作しない理由は誰にもありますか? ありがとうございました!ここで
は、すべてのコードです:
これは私がリクエストをするために迅速に使用する方法である:
func databaseRequest(size: String, interior: String, fuel: String) {
let baseURL = "https://$ACCOUNT-bluemix.cloudant.com/cars/_design/car_index/_search/car_index_name?q="
let queryURL = "size:\(size)"
let completeURL: String = baseURL + queryURL
let completeURLModified = completeURL.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)
let requestURL = URL(string: completeURLModified!)
var request = URLRequest(url: requestURL!)
request.httpMethod = "GET"
request.setValue("Basic \(credentials)", forHTTPHeaderField: "Authorization")
let task = URLSession.shared.dataTask(with: request){data, response, error in
guard error == nil else{
print("There was an error:", error as Any)
return
}
guard data == data else{
print("Data is empty")
return
}
let jsonResponse = try! JSONSerialization.jsonObject(with: data!, options: [])
print("This is JSON Response", jsonResponse)
}; task.resume()
}
これは、JSON応答からの応答である:
This is JSON Response {
error = "unknown_error";
reason = "function_clause";
ref = 1944801346;
}
これが役に立つ場合は、httpヘッダーからの残りのログ:
Optional(<NSHTTPURLResponse: 0x6080000349c0> { URL: https://$ACCOUNT-bluemix.cloudant.com/cars/_design/car_index/_search/car_index_name?q=size:small } { status code: 500, headers {
"Cache-Control" = "must-revalidate";
"Content-Length" = 70;
"Content-Type" = "application/json";
Date = "Thu, 24 Nov 2016 04:41:03 GMT";
Server = "CouchDB/2.0.0 (Erlang OTP/17)";
"Strict-Transport-Security" = "max-age=31536000";
Via = "1.1 lb1.bm-cc-dal-01 (Glum/1.31.3)";
"X-Cloudant-Backend" = "bm-cc-dal-01";
"X-Content-Type-Options" = nosniff;
"X-Couch-Request-ID" = 51e5e0b5e1;
"X-Couch-Stack-Hash" = 1944801346;
"X-CouchDB-Body-Time" = 0;
最後に少なくともではない、私はCloudantにおける設計ドキュメントにインデックスとして使用Javascriptのファイル:
function (doc) {
index("name", doc.name, {"store": true});
if (doc.fuel){ index("fuel", doc.fuel, {"store": true});}
if (doc.interior){ index("interior", doc.interior, {"store": true});}
if (doc.size){index("size", doc.size, {"store": true});
}}
URLはURL構造体によって二重にエンコードされていますか?おそらくあなたは生のunencoded文字列構造体をURL initに渡してみるべきです。 'data == data'も同じ変数なので、常にtrueになります。それが空であるかどうかを見たい場合は、 'data.size'をゼロと比較する方が良いでしょう。 – rhyshort
ダブルエンコードとは何ですか?ヒントからテストした内容:「completeURLModified」をコメントアウトし、completeURL Stringをimmediatly使って、URLRequestに必要なURLオブジェクト(requestURL)を作成しました。それでも同じ結果 - function-clauseエラー。 –