Как сделать POST запрос к Yandex Translate API?

162
03 февраля 2020, 22:00
$(document).ready(function () {
    let url = "https://translate.yandex.net/api/v1.5/tr.json/detect?key=trnsl.1.1.20150402T131655Z.e753695703b45806.bda2fd6beb5bd56a62f0034352aaebbdba3f0952&text=hey";
    let res = fetch(url, {
            method: 'POST',
            headers: new Headers({
                'Content-Type': 'application/x-www-form-urlencoded'
            })
        });
});

Это мой запрос. Выглядит как GET, верно? Проблема в том, что если я пытаюсь хоть один параметр запихнуть в Body, то запрос возвращает Bad Request.

let url = "https://translate.yandex.net/api/v1.5/tr.json/translate";
let res = fetch(url, {
        method: 'POST',
        body:JSON.stringify({key:"trnsl.1.1.20150402T131655Z.e753695703b45806.bda2fd6beb5bd56a62f0034352aaebbdba3f0952", lang:"en-ru", text:"hello"}),
        headers: new Headers({
            'Content-Type': 'application/x-www-form-urlencoded'
        })
    }).then(ok=>console.log(ok.json()));

В документации есть пример, где сам URL со всеми параметрами, кроме text. Окей, я и так сделал. Все равно не работает:

let url = "https://translate.yandex.net/api/v1.5/tr.json/translate?key=trnsl.1.1.20150402T131655Z.e753695703b45806.bda2fd6beb5bd56a62f0034352aaebbdba3f0952&lang=en-ru";
let res = fetch(url, {
        method: 'POST',
        body:JSON.stringify({text:"hello"}),
        headers: new Headers({
            'Content-Type': 'application/x-www-form-urlencoded'
        })
    }).then(ok=>console.log(ok.json()));

Задал body в явном виде, так же как у них в документации:

let url = "https://translate.yandex.net/api/v1.5/tr.json/translate?key=trnsl.1.1.20150402T131655Z.e753695703b45806.bda2fd6beb5bd56a62f0034352aaebbdba3f0952&lang=en-ru";
let res = fetch(url, {
        method: 'POST',
        body:'text:hello',
        headers: new Headers({
            'Content-Type': 'application/x-www-form-urlencoded'
        })
    }).then(ok=>console.log(ok.json()));

Можете проверить в консоли. Что я делаю не так? Я так понимаю, что в POST параметры должны быть в body, а не в строке запроса?

И это вроде бы не ограничение в кол-ве символов - до 1млн я еще точно не дошел

Answer 1

Благодаря @УстьянцевБорис, ответ для моего случая был найден крайне просто: Надо писать body:'text=hello'. Знак равно вместо двоеточия.

Update: Благодаря @Grundy, я нашел полный ответ.

Вот рабочий пример:

let url = "https://translate.yandex.net/api/v1.5/tr.json/translate";
let res = fetch(url, {
        method: 'POST',
        body:'key=trnsl.1.1.20190419T144929Z.9a7ce55bcbc0ab3a.7b061e1931fe57955befd67ab7151772bed63f0f&lang=en-ru&text=hello',
        headers: new Headers({
            'Content-Type': 'application/x-www-form-urlencoded'
        })
    }).then(ok=>console.log(ok.json()));

Для Content-Type: application/x-www-form-urlencoded, тело нужно задать в виде key1=value1&key2value2.

Про контент-типы для POST: ссылка

READ ALSO
Сортировка объекта в javascript

Сортировка объекта в javascript

Есть такой объект:

176
Функция для записи данных в массив

Функция для записи данных в массив

Столкнулся с такой проблемойУ меня есть функция (для вопроса упростил ее очень сильно):

194
Как правильно прочитать данный код var args = Array.prototype.slice.call(arguments); [дубликат]

Как правильно прочитать данный код var args = Array.prototype.slice.call(arguments); [дубликат]

Не могу связать воедино разрозненные (возможно поверхностные знания), помогите пожалуйста!

179