Я запрашиваю конечную точку graphQL через http-запрос и получаю успешный ответ с данными, которые мне нужно собрать, однако я не могу перемещаться по данным, чтобы получить нужные мне поля.
const query = JSON.stringify({query:
'{' +
' all_insight_article('+
' locale: "en-gb"'+
' where: {business_unit: {business_unit: {title: "Some Brand"}, MATCH: ALL}, audience: {MATCH: ALL, audiences: {title: "Management"}}publish_date_gt: "2023-02-01"}'+
' ) {items {'+
' audienceConnection {'+
' edges {'+
' node {... on Audiences {title system {uid}}}}}'+
' system {'+
' uid'+
' publish_details {time}'+
' updated_at}'+
' absolute_url'+
' title'+
' subtitle'+
' main_image'+
' topicsConnection {'+
' edges {'+
' node {'+
' ... on Topics {'+
' title'+
' display_name'+
' system {uid}}}}}}total}}'
});
var req = new HttpClientRequest("https://eu-graphql.contentstack.com/stacks/bltcxxx?environment=xxx&access_token=xxx")
req.header["Content-Type"] = "application/json"
req.method = "POST"
req.body = query
req.execute()
var response = req.response;
var posts = JSON.parse(response.body);
var articleList_json = [];
var i
for ( i = 0; i < 15; i++) {
articleList_json.push({
"title": posts[i].title,
});
}
logInfo(articleList_json);
Ошибка, которую я получаю, это posts is undefined.
Примечание. HttpClientRequest — это класс для моего приложения, но в значительной степени это стандартный HTTP-запрос https://experienceleague.adobe.com/developer/campaign-api/api/c-HttpClientRequest.html
2-е обновление
Я пробовал следующее, но все еще не работает
var response = req.response;
var posts = JSON.stringify(response.body);
var articleList_json = [];
var i
for ( i = 0; i < 15; i++) {
var graphQLJSON = JSON.parse(posts[i]);
articleList_json.push({
"title": graphQLJSON.data.title,
});
}
logInfo(articleList_json);
Кроме того, что именно вы хотите сделать? Вам нужно получить определенные поля или выполнить итерацию по многим полям? Если вам нужно перебирать, то по каким полям?
Какие поля или каковы критерии?
Спасибо, я обновил вопрос с новой структурой и сопоставлениями, у меня возникли проблемы даже с простым заголовком.
Я попытался posts[i].data.all_insight_article.items.title вытащить заголовок, но ничего не вышло, по-прежнему возвращается undefined.
JSON.parse() берет строку в структуре json и анализирует ее:
Статический метод JSON.parse() анализирует строку JSON, создавая значение JavaScript или объект, описанный строкой. Может быть предоставлена необязательная функция восстановления для выполнения преобразования результирующего объекта перед его возвратом.
Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse
Пример строки JSON:
const json = '{"result":true, "count":42}';
const obj = JSON.parse(json);
HttpClientRequest возвращает объект HttpClientResponse, который вы должны сначала преобразовать в строку перед его разбором (при условии, что возвращаемая строка имеет допустимую структуру json):
var content = response.body.toString(response.codePage);
var posts = JSON.parse(content);
Https://experienceleague.adobe.com/developer/campaign-api/api/p-HttpClientResponse-body.html
Пример полной документации:
var http = new HttpClientRequest("http://www.google.com/")
http.execute()
var response = http.response
if ( response.code != 200 )
throw "HTTP request failed with " + response.message
var content = response.body.toString(response.codePage)
Как мне вытащить заголовок из JSON? posts[i].data.all_insight_article.items.title похоже не работает
Честно говоря, я не уверен, так как я не совсем знаком с API и не вижу возвращаемых данных. Это может быть отдельный вопрос, который вы задаете с соответствующей информацией. Однако в ответ на этот конкретный вопрос проблема будет заключаться в том, как вы обрабатываете ответ, как описано в моем ответе. Надеюсь это поможет :)
Спасибо, пример ответа здесь codebeautify.org/jsonviewer/y23e94b41 Буду тестировать дальше
Вы уверены, что массив находится в posts, а не в all_insight_article.items? т. е. следует ли вам обращаться к нему как all_insight_article.items[i] вместо posts[i]?
Возможно, console.info объект posts и посмотреть, является ли он массивом. Если это не так, то posts[i] не сработает. console.info posts.data.all_insight_article.items[i] и обратите внимание, что... возможно, вы ищете posts.data.all_insight_article.items[i].title
На самом деле, глядя на пример ответа, похоже, что title на самом деле в posts.data.all_insight_article.items[0].title - «Шесть ключевых различий между частным капиталом и инвестициями на публичном рынке».
var response = JSON.stringify(req.response); var posts = JSON.parse(response.body); var articleList_json = []; var i; for ( i = 0; i < 15; i++) { articleList_json.push({ "title": posts.data.all_insight_article.items[i].title, }); }
Я получаю 22/02/2023 03:30:38 js JST-310000 Error while compiling script 'WKF12/js' line 46: JSON.parse. что-то не так с синтаксическим анализом, я применяю это неправильно?
Наконец-то заработало
var response = req.response;
var jsonData = JSON.parse(response.body)
var articleList_json = [];
var i;
for (i = 0; (i < 15 && i < jsonData.data.all_insight_article.items.length); i++) {
articleList_json.push({
"title": jsonData.data.all_insight_article.items[i].title.toString()
});
}
logInfo("Count "+i);
logInfo(JSON.stringify(articleList_json));
Консольный журнал массива объектов
[
{
"title": "Six key differences between private equity and public market investing"
},
{
"title": "Securing the supply of rare earth metals is central to our energy transition"
},
{
"title": "Test article for charts"
},
{
"title": "Central banks hike rates again - but for how much longer?"
}
]
К вашему сведению: эту чудовищную строку можно упростить с помощью шаблонного литерала (строка с обратными кавычками)