я делаю вызов $ http.jsonp в угловой зависимости от Apple iTunes Search API для извлечения данных о песнях от конкретного исполнителя.
Нормальный запрос на получение конечной точки будет
https://itunes.apple.com/search?callback=angular.callbacks._0&term=madonna+ghosttown
Посмотрите, что обратный вызов вводится $ http.jsonp, и он будет работать правильно. Проблема в том, что вызов кодирует url и заменяет "+" на "%2B". Это разбивает Api и возвращает пустой массив.
Вызов будет выглядеть следующим образом:
https://itunes.apple.com/search?callback=angular.callbacks._0&term=madonna%2Bghosttown
Как я могу заставить $ http не подставлять "+", который разделяет условия поиска? Следующий блок кода показывает мой вызов.
$http.jsonp("http://itunes.apple.com/search", {
params: {
"callback": "JSON_CALLBACK",
"term": "madonna+ghosttown"
}
}).success(function (data, status, headers, config) {
console.log(data);
}).error(function (data, status, headers, config) {
console.log(data);
});
Я бы очень признателен вам за вашу помощь здесь. Привет, Бен
Я предлагаю два возможных решения.
Как я вижу, проблема связана с Angular $ httpParamSerializer, который автоматически кодирует параметры URL.
Первое решение состоит в том, чтобы вообще не использовать ключ params
и добавлять параметры URL вручную к URL-адресу, например:
$http.jsonp("http://itunes.apple.com/search?callback=JSON_CALLBACK&term=madonna+ghosttown");
Второе решение может заключаться в переопределении стандартного $ httpParamSerializer, который используется Angular $ http (см. Документацию API http http, раздел "Использование", ключ конфигурации "paramsSerializer"). A (чрезмерно упрощенным) примером будет следующий код, который вообще не кодирует параметры:
$http.jsonp("http://itunes.apple.com/search", {
params: {
"callback": "JSON_CALLBACK",
"term": "madonna+ghosttown"
},
paramsSerializer: function(param) {
return param;
}
});