2016-11-24 8 views
0

Это мой первый вопрос здесь, и у меня мало опыта в кодировании, поэтому, пожалуйста, несите меня. Благодаря!Ошибка функции-объекта Cloudant при HTTP-запросе GET

Я определил некоторые документы в своей учетной записи Blueemix Cloudant с разными автомобилями, которые имеют разные характеристики. Я хочу получить одну запись из внешнего приложения IOS Swift.

Это URL Пример запроса: HTTPS: //$ACCOUNT-bluemix.cloudant.com/cars/_design/car_index/_search/car_index_name д = размер: маленький

Теперь проблема: Если я используйте этот 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; 

Последний, но не менее файл Javascript я использую в качестве индекса в разработке документа в Cloudant:

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? Возможно, вам стоит попробовать передать только необработанную строковую строку в URL init. Также 'data == data' всегда будет истинным, так как они являются одной и той же переменной. Было бы лучше сравнить «data.size» с нолем, если вы хотите увидеть, пуст он или нет. – rhyshort

+0

Я не совсем уверен, что вы подразумеваете под двойным кодированием. То, что я проверил из вашего намека: я прокомментировал «completeURLModified» и немедленно использовал полную строкуURL String для создания URL-объекта (requestURL), который мне нужен для URLRequest. Все тот же результат - ошибка функции-предложения. –

ответ

0

Я думаю, что эта ошибка происходит из-за Cloudant пытается расшифровать то, что вы прошли, как \(credentials) в кодировке Base64. Если \(credentials) не является допустимым base64 строки в кодировке (например, содержит, кроме a-z, A-Z, 0-9, +, / и = символов), то я думаю, функция декодирования base64 этого Cloudant терпит неудачу с вышеуказанной ошибкой.

Вы должны убедиться, что \(credentials) является строкой <your_username>:<your_password> закодирована правильно. Например. если ваше имя пользователя - john, а ваш пароль - doe, то \(credentials) должен быть am9objpkb2U=.

 Смежные вопросы

  • Нет связанных вопросов^_^