У нас есть веб-сервис, который возвращает информацию о продукте. Служба ожидает массив JSON в данных поста …
Пример скрипта с простой тестовой веб-страницы HTML выглядит следующим образом (это работает, как и ожидалось):
ltscript src = "// code.jquery.com/jquery-1.11.2.min.js"></ скрипт> <script type = "text / javascript"> $ (Документ) .ready (функция () { // запрос - это массив идентификаторов продуктов, например ПИД-регулятор: [71,72,74] // запрос - это массив поисковых терминов, например найти: [ 'яблоки', 'апельсины', 'груши'] // запрос может содержать запрашиваемые поля из продуктов // fields: ['CostPrice', 'Опубликовано', 'title', 'Price'] jQuery.ajax ({ URL: 'http://somewebsite.com/__getProductData', тип: 'POST', dataType: 'json', данные: {pid: [658,71,6,700], поля: ['pid', 'CostPrice', 'type', 'опубликовано', 'title']}, success: function (data) { // сделать что-то с ответом ... });}, error: function (jqXHR, textStatus, errorThrown) {alert ('Error Error:' + textStatus + 'Error:' + errorThrown); } } );}); </ скрипт>
Веб-сервис, написанный на PHP, получает это правильно. Сброс (print_r) данных, полученных веб-службой от клиента, приводит к следующему массиву:
Array ( [pid] => Array ([0] => 658 [1] => 71 [2] => 6 [3] => 700) [fields] => Array ([0] => pid [1] => CostPrice [2] => type [3] => type [4] => опубликованный [5] => заголовок)
Теперь к проблеме …. Я пытаюсь вызвать веб-сервис из скрипта Google Sheet следующим образом:
функция getProduct (pid, datetime) { // var url = 'https://somewebsite.com/__getProductData'; // pid: [658,71,6,700], поля: ['pid', 'CostPrice', 'type', 'опубликовано', 'title'] var nids = new Array (658,71,6,700); var fields = ['pid', 'CostPrice', 'type', 'опубликовано', 'заголовок'] переменная полезная нагрузка = { pid: nids, поля: поля }; вар параметры = { «метод»: «POST», «полезная нагрузка»: полезная нагрузка}; var response = UrlFetchApp.fetch (url, параметры); Logger.log (ответ);}
Когда веб-сервис PHP вызывается из скрипта Google Sheets, массив JSON не получен правильно:
Array ([data] => {pid = [Ljava.lang.Object; @ 1bfbb500} fields = [Ljava.lang.Object; @ 3ffbb500})
Я ожидаю, что это связано с кодировкой или заголовками … Я пробовал большинство комбинаций заголовков и contentType, но безрезультатно … например.
var headers = {"Accept": "json", "Content-Type": "применение / JSON", };
Предложения кого-нибудь?
var options = {
"method": 'POST',
"payload": JSON.stringify(payload)
};
Или зачеркните каждое из значений для pid & поля.
Джонатан — твой предложенный комментарий — решение ….
Это не сработало:
var options =
{
"method": 'POST',
"payload": JSON.stringify(payload)
};
но stringify на элементах массива полезной нагрузки работал (обратите внимание, что простые элементы работали без stringify, например, ‘text’: «некоторый текст здесь»):
var nids = [658,71,6,700 ];
var fields = ['pid','CostPrice','type','published','title']
var payload =
{
pid : JSON.stringify(nids),
fields: JSON.stringify(fields)
};
var options =
{
"method": 'POST',
"payload": payload
};
Я думаю, что я решил ту же проблему:
Как отправить почтовый запрос с массивом в полезной нагрузке по urlfetchapp
полезная нагрузка должна быть подготовлена таким образом! Я нашел это решение во время создания обходного сценария PHP.
var payload =
{
"fields[0]":"firstString",
"fields[1]":"anotherString in array",
}
Не очень интуитивно понятно, но у меня получилось отлично!