xml vs json
Closed this issue · 8 comments
Почему в API испоьзуются xml запросы вместо json?
Есть какие то подводные камни в использовании json?
Я мог бы передать разработчикам InSales, информацию о багах с такими запросами.
Например при загрузке через node.js api файла или ассета с одинаковым именем от сервера возвращается ошибка не заполнены обязательные поля
, вместо уведомления о том что такой файл уже существует.
Документация InSales API JSON
Пробовал в рестлере использовать postJson, запросы проходили, вот в таком виде:
export function post(conn) {
if (conn.obj !== undefined) {
opt.data = conn.obj;
}
const p = rest.postJson(`https://${conn.id}:${conn.token}@${conn.url}/admin/${conn.api}.json`, opt.data);
return new Promise((resolve, reject) => {
request(p)
.then(resolve)
.catch(reject);
});
}
Правда почему то когда передавал опции появляется ошибка не заполнены обязательные поля
.
P.s в headers менял Content-Type на application/json.
Вот так сделал, возвращает правильную ошибку в случае задвоения, и естественно заливает файл если его нет:
/**
* Options for Restler
*
* @returns {Object}
*/
export default {
headers: {
'Content-Type': 'application/json; charset=utf-8'
},
xml2js: {
trim: false,
explicitArray: false,
ignoreAttrs: true
},
timeout: 30000
};
import { request } from '../request';
import rest from 'restler';
import { Xml2js } from 'xml2js';
import options from '../options';
const _opt = options;
/**
* POST request
*
* @param {Object} conn
* @param {string} conn.id Required, app id
* @param {string} conn.token Required, token to access shop
* @param {string} conn.url Required, shop url
* @param {string} conn.api Required, api endpoint
* @param {object} [conn.obj] HTTP POST data
* @returns {Promise}
*/
export function post(conn) {
const _data = conn.obj || {};
const p = rest.postJson(`https://${conn.id}:${conn.token}@${conn.url}/admin/${conn.api}.json`, _data, _opt);
return new Promise((resolve, reject) => {
request(p)
.then(resolve)
.catch(reject);
});
}
У них json отдаёт не весь api, а xml весь. Плюс попадаются моменты где xml ответ полный, а в json ответе многого нет.
А передавать им что-либо бесполезно, багу где во время триала можно удалить приложение и заново поставить, начав тем самым триал сначала и нифига не платя за приложение, уже много лет. Я об этом говорил и Артему и потом Антону, бесполезно. И там ещё куча всякой фигни, с insales я больше не работаю.
Объект покажите который у вас в opt.data
А какие конкретно запросы возвращали не полную информацию.
Только что спрашивал у разработки, они точно обратят внимание на косяки с неполными ответами.
Если в доке по json чего то нет, то можно ориентироваться на xml, wiki.insales
Сходу не назову, но было такого много. Это же просто тестируется, делается два запроса к xml и json. Из xml делается json и проверяются два json на разницу между ними.
А насчёт загрузки того же файла, оно точно работает ибо здесь https://github.com/pomeo/insalesprice/blob/master/jobs.js#L1332 этой проверке уже куча времени. И приложение как работало, так и работает используя эту библиотеку.
Тогда если оставлять xml надо править передачу опций в restler.
Почему то следующий код создаёт пустой объект.
const opt = Object.create(options);
И если из npm поставить пакет insales
то какой то косяк с xml2js.Builder()
Внутри функции post xml2js - undefined
Вот только что взял из мастера
insales.uploadFile({
token: 'бла-бла',
url: 'бла-бла.myinsales.ru',
files: {
file: {
src: 'https://бла-бла'
}
}
}).then(output => {
console.info(output.data);
}).catch(err => {
console.error(err.msg.errors.error);
});
и получил 'Название уже существует'
А в npm улетел пакет с другой точкой входа, перезалил теперь работает
Да всё работает, спасибо!