Как исправить вызов POST API при получении «HttpStatus 400 — неверный запрос»?

#javascript #api #post #google-apps-script #qualtrics

#javascript #API #Публикация #google-apps-script #qualtrics

Вопрос:

Моя цель — экспортировать ответы из опроса, который я сделал на Qualtrics, используя Google Apps Script. Я пытаюсь заставить свой код работать с POST API, и я получил код для пинга, но что бы это ни было, он возвращается с ошибкой «HttpStatus: 400-Неверный запрос».

Я новичок как в Google Apps Script, так и в использовании API, но понимаю суть этого. Я использовал Postman для получения кода JavaScript Jquery ajax и заставил его работать с GAS. Что меня смущает, так это то, что когда я использую тот же код с GET API и вручную набираю идентификаторы (предоставленные мне с помощью POSTMAN), он отлично пингуется. При запуске его через Postman он показывает, что все проходит, поэтому не уверен, что я делаю не так с вызовом POST.

 var option = {
  async: true,
  crossDomain: true,
  //url:"https://ousurvey.ca1.qualtrics.com/API/v3/surveys/SV_8dK8AKUFyAH8qyN//export-responses/",
  method: "POST",
  "headers": {
    "X-API-TOKEN": "**************************",
    "Content-Type": "application/json",
    "cache-control": "no-cache",
    "Postman-Token": "7a148b75-fa03-4f45-9782-08791c2f1c35"
  },
  processData: false,
  data : '{"format": "csv}',
  muteHttpExceptions: true //muted to check Logger
   };
 var qUrl='https://ousurvey.ca1.qualtrics.com/API/v3/surveys/SV_8dK8AKUFyAH8qyN/export-responses/'
 var getSurvey = UrlFetchApp.fetch(qUrl, option);
  

Мне нужно заставить POST работать, чтобы получить JSON для получения идентификатора опроса, чтобы я мог использовать этот идентификатор с GET API для загрузки информации на Google диск и преобразования информации в GoogleDocs.

Вот текущая ошибка из журнала:

 {"meta":{"httpStatus":"400 - Bad Request","error":{"errorMessage":"Error decoding json body:
 com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-inputn at 
[Source: akka.util.ByteIterator$ByteArrayIterator$$anon$1@71f9c2bb; line: 1, column: 0]"}}}
  

После изменения «Content-Type» на «ContentType» я получаю эту ошибку:

 ""meta":{"requestId":"62b3a313-b1ba-4939-83b7-ee73e65b4e3e","httpStatus":"400
 - Bad Request","error":{"errorCode":"QVAL_1","errorMessage":"Json type request body is expected.""
  

Комментарии:

1. Ваши данные, вероятно, должны быть просто объектом, т. Е. { "format" : "csv" } , а не строкой.

2. Не повезло, я пытался это сделать и все еще выдает неверный запрос

3. У вас есть сообщение об ошибке / код? Что-то вроде «Ожидал _ но получил _»?

4. Я обновил сообщение об ошибке, которое я получаю, вместе с изменением формата данных.

5. Можете ли вы предоставить документ API? И я подумал, что эта информация может быть полезна для вас. developers.google.com/apps-script/reference/url-fetch/… Но если это было бесполезно, я прошу прощения.

Ответ №1:

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

 curl -X POST 
-H 'X-API-TOKEN: yourapitokenhere' 
-H 'Content-Type: application/json' 
-d '{"format": "csv"}' 
'https://yourdatacenterid.qualtrics.com/API/v3/surveys/SV_012345678912345/export-responses'
  

Я преобразовал этот пример в скрипт Google Apps Script. Пример сценария выглядит следующим образом.

Пример сценария:

 var qUrl = "https://ousurvey.ca1.qualtrics.com/API/v3/surveys/SV_8dK8AKUFyAH8qyN/export-responses/";
var option = {
  method: "post",
  headers: {"X-API-TOKEN": "###"},
  contentType: "application/json",
  payload: JSON.stringify({"format": "csv"}),
  muteHttpExceptions: true,
};
var getSurvey = UrlFetchApp.fetch(qUrl, option);
Logger.log(getSurvey)
  

Примечание:

  • Приведенный выше пример сценария — это тот же запрос с примером команды curl. Но если при запуске скрипта возникает ошибка, пожалуйста, подтвердите значение X-API-TOKEN , URL и другие параметры, которые необходимы в вашей ситуации.

Ссылки:

Комментарии:

1. Вы — благословение. Спасибо.

2. @nguyenJEN Спасибо за ответ. Я рад, что ваша проблема была решена.