Это мой первый вопрос здесь, и у меня мало опыта в кодировании, поэтому, пожалуйста, несите меня. Благодаря!Ошибка функции-объекта 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});
}}
Является ли ваш URL двойной кодировкой структурой URL? Возможно, вам стоит попробовать передать только необработанную строковую строку в URL init. Также 'data == data' всегда будет истинным, так как они являются одной и той же переменной. Было бы лучше сравнить «data.size» с нолем, если вы хотите увидеть, пуст он или нет. – rhyshort
Я не совсем уверен, что вы подразумеваете под двойным кодированием. То, что я проверил из вашего намека: я прокомментировал «completeURLModified» и немедленно использовал полную строкуURL String для создания URL-объекта (requestURL), который мне нужен для URLRequest. Все тот же результат - ошибка функции-предложения. –