В HTTP-ответе InDesign Socket отсутствуют разделы - PullRequest
0 голосов
/ 15 февраля 2020

Я автоматизирую Adobe InDesign для создания документов с использованием JSON данных, собранных из веб-API с серверной частью SQL. Я использую объект Sockets, чтобы сделать HTTP 1.0 вызов на наш сервер. Иногда в полученном ответе отсутствует около 1700 символов из разных точек в строке JSON, но когда я вызываю одну и ту же конечную точку API с помощью curl или Postman, я получаю полный и действительный ответ.

Ответ должен быть примерно 150k символов, и я использую conn.read (99999999), чтобы прочитать его. Кроме того, внешний вид конца строки выглядит правильно, поэтому я не верю, что это какая-либо проблема усечения.

Эта проблема возникает только тогда, когда я запрашиваю кодировку UTF-8. Если я запрашиваю ASCII, я получаю полный и действительный ответ, но пропускаю различные символы Юникода. Если я запрашиваю BINARY, я получаю полный и действительный ответ, но JavaScript / ExtendScript, похоже, обрабатывает любые многобайтовые символы Юникода, полученные как отдельные байты, а не как символы Юникода, которые мы хотим отобразить.

Вот иллюстрация поведения, которое я вижу, используя фиктивные данные ...

"Ожидаемый" ответ ...

[{"Id":1, "name":"Random Name", "Text":"A bunch of text", "AnotherId": 1}]

«Фактический» ответ ...

[{"Id":1, "name":"Random Name", "Text":"A bunc": 1}]

Проблема сначала проявлялась как ошибка синтаксического анализа JSON2, по понятным причинам, но root Кажется, это тот факт, что части данных пропадают при передаче.

До сих пор мы видели эту проблему только при выполнении вызова с использованием объекта InDesign Sockets, и не каждый ответ демонстрирует такое поведение.

Буду признателен за любую помощь или идеи, которые вы можете предложить.

Вот функция, которую я использую для вызова данных ...

function httpRequest(url, encoding) {
   try {
      var response = "";

      var hostName = getHostFromUrl(url);
      var pathAndQuery = getPathAndQueryFromUrl(url);

      var httpGet = "GET ";
         httpGet += pathAndQuery;
         httpGet += " HTTP/1.0\r\nHost: ";
         httpGet += hostName;
         httpGet += "\r\n";

      var conn = new Socket;

      conn.timeout = 30;
     //conn.encoding = encoding || "UTF-8";
     //conn.charset = "UTF-16";

      if (conn.open(hostName + ":80", encoding || "UTF-8")) {
         // send a HTTP GET request
         conn.writeln(httpGet);

         // and read the server's response
         response = conn.read(99999999);

         conn.close();
      }

      return parseHttpResponse(response);
   }
   catch (e) {
      $.writeln(e);
      $.global.alert("There was a problem making an HTTP Request: " + e);
      return null;
   }
}

1 Ответ

0 голосов
/ 18 февраля 2020

Оказывается, моя обработка HTTP-ответа была слишком упрощенной c и требовалась дополнительная логика c для правильной обработки символов Юникода.

В моем случае решение заключалось в использовании метода GetURL сделанный доступным Крисом Коппайтером здесь .

...