2016-11-24 19 views
0

これは私の最初の質問です。ありがとう!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}); 
    }} 
+0

URLはURL構造体によって二重にエンコードされていますか?おそらくあなたは生のunencoded文字列構造体をURL initに渡してみるべきです。 'data == data'も同じ変数なので、常にtrueになります。それが空であるかどうかを見たい場合は、 'data.size'をゼロと比較する方が良いでしょう。 – rhyshort

+0

ダブルエンコードとは何ですか?ヒントからテストした内容:「completeURLModified」をコメントアウトし、completeURL Stringをimmediatly使って、URLRequestに必要なURLオブジェクト(requestURL)を作成しました。それでも同じ結果 - function-clauseエラー。 –

答えて

0

私は、このエラーはあなたがbase64でエンコードされた文字列として\(credentials)として渡されたものは何でも解読しようとしてcloudantが原因だと思います。 \(credentials)が有効なbase64でエンコードされた文字列は、(例えばa-zA-Z0-9+/=以外の文字が含まれている)でない場合は、その後、私の推測では、そのcloudantのbase64でデコード機能は、上記のエラーで失敗しています。

\(credentials)が正しく符号化された文字列<your_username>:<your_password>であることを確認する必要があります。例えば。ユーザー名がjohn、パスワードがdoeの場合、\(credentials)am9objpkb2U=になります。

関連する問題