Итак, я пытаюсь сократить URL-адрес с помощью нового API Bitly V4, но получаю ошибку JSON.
Мой код:
$(function() {
$(".createBitly").on("click", function(e) {
e.preventDefault();
var url = $(this).attr("href");
var accessToken = "xxx";
var params = {
"long_url" : encodeURIComponent(url)
};
$.ajax({
url: "https://api-ssl.bitly.com/v4/bitlinks",
cache: false,
dataType: "json",
method: "POST",
contentType: "application/json",
beforeSend: function (xhr) {
xhr.setRequestHeader("Authorization", "Bearer " + accessToken);
},
data: params
}).done(function(data) {
console.info(data);
}).fail(function(data) {
console.error(data);
});
});
});
Результаты: ошибка http 422;
"{"message":"UNPROCESSABLE_ENTITY","resource":"bitlinks","description":"The JSON value provided is invalid."}"
Но запуск с CURL работает: Как сократить URL-адрес с помощью PHP Bitly v4?
Что я делаю неправильно? Разве это невозможно только с jQuery?
ТИА.
да, кажется, вы не отправляете правильные данные в кодировке json
Я также пробовал escape(), но не повезло. Также попробовал «https://stackoverflow.com/questions/ask» в виде строки, но тоже не повезло.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я сделал это редактирование из вашего кода выше, и он работает хорошо.
1) JSON.stringify перед отправкой запроса (конвертируйте запрос в формат JSON).
2) Не нужно encodeURIComponent().
$(function() {
$(".createBitly").on("click", function(e) {
e.preventDefault();
var url = $(this).attr("href");
var accessToken = "token";
var params = {
"long_url" : url
};
$.ajax({
url: "https://api-ssl.bitly.com/v4/shorten",
cache: false,
dataType: "json",
method: "POST",
contentType: "application/json",
beforeSend: function (xhr) {
xhr.setRequestHeader("Authorization", "Bearer " + accessToken);
},
data: JSON.stringify(params)
}).done(function(data) {
console.info(data);
}).fail(function(data) {
console.info(data);
});
});
});
Может ли быть так, что значение long_url должно быть экранированной строкой JS, а не кодироваться путем применения к ней encodeURIComponent()? Пример в связанном случае: {"long_url":"https://stackoverflow.com/questions/ask"}. Что будет «https% 3A% 2F% 2Fstackoverflow.com% 2Fquestions% 2Fask» после кодирования. Я предполагаю, что Bitly хочет найти косые черты, чтобы обработать URL-адрес. Интересно, что документы Bitly API говорят, что long_url «должен» быть uriencoded, но ответ в примере, на который вы ссылаетесь, использует json_encode.