WIX Fetch API возвращает пустой JSON (VELO)
Обзор
Я использую AgileCRM. Я хотел бы создавать новые контакты в этой CRM, когда пользователи заполняют форму. Мне удалось сделать это в PostMan. Я пытаюсь выполнить простой запрос «GET» от WIX, чтобы я мог понять код VELO, прежде чем перейду к своему запросу POST (создать контакты).
Проблема
Когда я делаю
POST
это не то, что я определил как метод.
Вопрос
Что я делаю здесь не так, что вызывает как пустой ответ, так и неправильный метод?
Настраивать
Мой интерфейс импортирует бэкэнд-функцию, которая обрабатывает базовую аутентификацию и выборку. Я сделал это так, как когда я делал это из внешнего интерфейса, у меня возникла проблема с CORS.
//agileapi.jsw
import {fetch} from 'wix-fetch';
import base64 from "nodejs-base64-encode";
import {getSecret} from 'wix-secrets-backend';
export async function getAPIKey() {
return await getSecret("AGILERESTAPI");
}
export async function getUsername() {
return await getSecret("AGILEUSERNAME");
}
let password = getAPIKey()
let username = getUsername()
let options = {
"method": "GET",
headers: {
"Authorization": 'Basic ' + base64.encode(username + ":" + password, 'base64'),
"Content-Type": "application/json",
}
}
let url = "https://photodynamic.agilecrm.com/dev/api/contacts";
export async function getContacts() {
await fetch(url, options)
.then( (response) => {
if(response.ok) {
return response.json()
}
else {
return Promise.reject('Fetch did not succeed');
}}
)
.then((json) => console.log(json))
.catch((err) => console.log(err));
}
//wix debug page code
import {getContacts} from 'backend/agileapi'
$w.onReady(function (){
$w("#getContacts").onClick( (event) => {
getContacts()
})
});
2 ответа
Вы должны дождаться выполнения обещаний. Пароль и имя пользователя в вашем коде , это не строка , это обещание.
//agileapi.jsw
import { fetch } from 'wix-fetch';
import base64 from "nodejs-base64-encode";
import { getSecret } from 'wix-secrets-backend';
const url = "https://photodynamic.agilecrm.com/dev/api/contacts";
export async function getContacts() {
// Wait for until all promises to be fulfilled
const [password, username] = await Promise.all([
getSecret("AGILERESTAPI"),
getSecret("AGILEUSERNAME")
])
const options = {
method: "GET",
headers: {
// Now the password and username are the strings
"Authorization": 'Basic ' + base64.encode(username + ":" + password, 'base64'),
"Content-Type": "application/json",
}
}
// Returns the API result to client (browser)
return fetch(url, options)
.then((response) => {
if (response.ok) {
return response.json();
}
return Promise.reject('Fetch did not succeed');
});
}
Код страницы
import { getContacts } from 'backend/agileapi'
$w.onReady(function () {
$w("#getContacts").onClick((event) => {
getContacts()
.then((json) => {
// Your json
console.log(json);
})
.catch((error) => {
// Reason of error
console.log(error)
});
})
});
Я смог решить эту проблему. Остальные api по умолчанию вернули xml. Добавление следующего в мои заголовки позволило мне отформатировать его как JSON.
let options = {
"method": "GET",
headers: {
"Authorization": 'Basic ' + base64.encode(username + ":" + password, 'base64'),
"Content-Type": "application/json",
// added this to resolve the issue
"Accept": "application/json"
}
}
Это решение специфично для AgileCRM и может отличаться в зависимости от используемого вами API. Надеюсь, мой приведенный выше код поможет другим выполнять вызовы API с WIX Velo.