pomeo/node-insales

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);
  });
}
pomeo commented

У них json отдаёт не весь api, а xml весь. Плюс попадаются моменты где xml ответ полный, а в json ответе многого нет.
А передавать им что-либо бесполезно, багу где во время триала можно удалить приложение и заново поставить, начав тем самым триал сначала и нифига не платя за приложение, уже много лет. Я об этом говорил и Артему и потом Антону, бесполезно. И там ещё куча всякой фигни, с insales я больше не работаю.
Объект покажите который у вас в opt.data

А какие конкретно запросы возвращали не полную информацию.
Только что спрашивал у разработки, они точно обратят внимание на косяки с неполными ответами.
Если в доке по json чего то нет, то можно ориентироваться на xml, wiki.insales

pomeo commented

Сходу не назову, но было такого много. Это же просто тестируется, делается два запроса к xml и json. Из xml делается json и проверяются два json на разницу между ними.

pomeo commented

А насчёт загрузки того же файла, оно точно работает ибо здесь https://github.com/pomeo/insalesprice/blob/master/jobs.js#L1332 этой проверке уже куча времени. И приложение как работало, так и работает используя эту библиотеку.

Тогда если оставлять xml надо править передачу опций в restler.
Почему то следующий код создаёт пустой объект.
const opt = Object.create(options);
И если из npm поставить пакет insales то какой то косяк с xml2js.Builder()
Внутри функции post xml2js - undefined

pomeo commented

Вот только что взял из мастера

insales.uploadFile({
  token: 'бла-бла',
  url: 'бла-бла.myinsales.ru',
  files: {
    file: {
      src: 'https://бла-бла'
    }
  }
}).then(output => {
  console.info(output.data);
}).catch(err => {
  console.error(err.msg.errors.error);
});

и получил 'Название уже существует'

pomeo commented

А в npm улетел пакет с другой точкой входа, перезалил теперь работает

Да всё работает, спасибо!