Скрипт Google Apps UrlFetchApp.fetch преобразует целые числа в числа с плавающей запятой?

Я пишу скрипт приложения Google, который обращается к нескольким API с помощью UrlFetchApp.

Один из моих запросов POST API ожидает целочисленного значения в полезной нагрузке, но UrlFetchApp.fetch изменяет целочисленное значение (то есть 0) на float (то есть 0,0)

Мои варианты выглядят примерно так:

const options = { method: 'POST', headers: {...}, payload: { someStringA: "foo", someStringB: "bar", App: 0 } }

И сообщение об ошибке, возвращаемое API, выглядит следующим образом:

{"message":"The request is invalid.","modelState":{"request.App":["The value '0.0' is not valid for App.","The App field is required."]}}

UrlFetchApp.fetch преобразовал значение моего приложения: 0 в: 0,0, которое эта конечная точка API не принимает.

Вместо этого я попытался принудительно установить значение запроса на строку 0, но API не принимает строковый тип для этого свойства.

Кто-нибудь знает обходной путь для этого? Как я могу указать UrlFetchApp.fetch сохранять целочисленные значения как есть, а не преобразовывать их в числа с плавающей запятой?

пс. тот же запрос работает нормально для меня через cURL следующим образом:

curl --location --request POST "https://$url" \
    --header 'Content-Type: application/json' \
    --header "Authorization: Bearer $token" \
    --data "{\"someStringA\":\"$foo\",\"someStringB\":\"$bar\",\"app\":0}"

Спасибо заранее за любую помощь

ОБНОВЛЕНИЕ: извиняюсь, но проблема здесь не в UrlFetchApp. Моя проблема заключалась в том, что ответ, возвращаемый из api, был пустым объектом, и я пытался зарегистрировать его следующим образом: JSON.parse (response); что приводит к упомянутым ошибкам.


person Richard Salt    schedule 06.02.2021    source источник
comment
Можете ли вы предоставить образец команды curl, которую вы подтвердили?   -  person Tanaike    schedule 06.02.2021


Ответы (1)


Из вашего вопроса, к сожалению, я не уверен в спецификации API, который вы хотите использовать, заголовке вашего запроса и вашей команде curl, которую вы подтвердили. Итак, я хотел бы предложить следующие модели модификации как свою догадку.

Из:

const options = { method: 'POST', headers: {...}, payload: { someStringA: "foo", someStringB: "bar", App: 0 } }

Кому: образец 1

const options = { method: 'POST', headers: {...}, contentType: "application/json", payload: JSON.stringify({ someStringA: "foo", someStringB: "bar", App: 0 }) };
  • В этом случае данные отправляются в формате JSON.
  • Если вы используете Content-Type в headers, удалите его.

Кому: образец 2

const options = { method: 'POST', headers: {...}, payload: JSON.stringify({ someStringA: "foo", someStringB: "bar", App: 0 }) };
  • В этом случае данные отправляются как данные формы строкового значения.

Кому: образец 3

const options = { method: 'POST', headers: {...}, payload: { someStringA: "foo", someStringB: "bar", App: "0" } };
  • В этом случае "0" отправляется как строковое значение данных формы в проанализированных данных.

Примечание:

  • Если описанные выше шаблоны модификации не были решением вашей проблемы, можете ли вы предоставить свой образец команды curl, который вы подтвердили? Этим я хотел бы изменить свой ответ.

Ссылка:

Добавлен:

Из вашей команды curl я понял, что мой шаблон 1 совпадает с запросом вашей команды curl. Но из Unexpected end of JSON input вашего ответа, к сожалению, хотя я не уверен в вашем текущем скрипте, использующем мой шаблон 1, когда ваша команда curl преобразуется в скрипт Google Apps, это становится следующим. Можете ли вы проверить это еще раз?

const token = "###";  // Please use your token.
const data = { someStringA: "foo", someStringB: "bar", App: 0 };
const options = {
  method: 'POST',
  headers: { Authorization: `Bearer ${token}` },
  contentType: "application/json",
  payload: JSON.stringify(data)
};
const res = UrlFetchApp.fetch("your URL", options);
console.log(res.getContentText())
person Tanaike    schedule 06.02.2021
comment
Большое спасибо за предложения: шаблоны 1 и 3 приводят к SyntaxError: Неожиданный конец ввода JSON, а шаблон 2 приводит к усеченному ответу сервера: {message: Запрос недействителен .... Я обновил исходный вопрос с помощью команды curl. - person Richard Salt; 06.02.2021
comment
@ Ричард Солт Спасибо за ответ. Я прошу прощения за доставленные неудобства. Из вашей добавленной команды curl я подтвердил, что шаблон 1 совпадает с запросом вашей команды curl. Но, судя по сообщению об ошибке в вашем ответе, можете ли вы предоставить свой текущий сценарий, используя мой шаблон 1? Если можете, добавьте это к своему вопросу. Этим я хочу это подтвердить. - person Tanaike; 06.02.2021
comment
@Richard Salt Я добавил еще один пример скрипта, который преобразовал вашу команду curl в скрипт Google Apps. Не могли бы вы это подтвердить? В этом примере сценария я думаю, что запрос совпадает с вашей командой curl. Но если это не сработало. Еще раз прошу прощения. - person Tanaike; 06.02.2021
comment
Привет @Tanaike - спасибо за помощь, но я думаю, что зря потратил ваше время! Сообщения об ошибках, которые я вижу, исходят не от команды UrlFetchApp.fetch. Моя проблема заключалась в том, что сразу после получения я пытался проанализировать и зарегистрировать ответ, например: JSON.parse (response); однако объект ответа пуст, даже если команда post была успешной. Итак, теперь он работает на основе вашего решения Pattern 1 выше. - person Richard Salt; 06.02.2021
comment
@ Ричард Солт Спасибо за ответ. Я рад, что ваша проблема решена. - person Tanaike; 06.02.2021