Почему HTTP/SOAP считается “толстым”

Я думаю, что вы хотите округлить до ближайшего целого числа после выполнения num * 100. Прямо сейчас вы собираетесь округлить до следующего целого числа, используя Math.ceil.

Попробуйте использовать Math.round . Надеюсь, это поможет:

Обновление: Вам также придется использовать toFixed вместе с parseFloat для решения ошибок точности при умножении.

function customRound(num) {
  intermediateResult = Math.round(parseFloat((num * 100).toFixed(2))) / 100;
  return Math.floor(intermediateResult * 20) / 20;
}

console.log(customRound(32.34));
console.log(customRound(33.09));
console.log(customRound(67.445));
console.log(customRound(69.195));

Если вы хотите показать 2 десятичных знака, используйте toFixed вместе с [119 ] так: parseFloat(Math.round(res * 100) / 100).toFixed(2):

function customRound(num) {
  intermediateResult = Math.round(parseFloat((num * 100).toFixed(2))) / 100;
  const res = Math.floor(intermediateResult * 20) / 20;
  return parseFloat(Math.round(res * 100) / 100).toFixed(2)
}

console.log(customRound(32.34));
console.log(customRound(33.09));
console.log(customRound(67.445));
console.log(customRound(57.244));

2-е обновление:

function getIntString(num, factor = 1) {
  return (num * factor + "").split('.')[0];
}

function customRound(num) {
  const int = getIntString(num);
  const decimal = (num + "").split('.')[1];
  let precision;
  if (decimal) {
    if (decimal.length === 2) {
      precision = decimal + 0;
    } else {
      precision = decimal.slice(0, 3);
    }
  } else {
    return num;
  }
  const specificPrecision = precision.slice(1);
  if (specificPrecision > 40 && specificPrecision < 91) {
    precision = precision.slice(0, 1) + 50;
    return parseFloat(`${int}.${precision}`);
  } else if (specificPrecision >= 91) {
    if (parseInt(precision.slice(0, 1)) === 9) {
      return Math.ceil(num);
    } else {
      return (Math.floor(num * 10 + 1))/10;
    }
  } else {
    return parseInt(getIntString(num, 10)) / 10;
  }
}


const logResult = (inp) => `Input: ${inp}, Result: ${customRound(inp)}`;


console.log(logResult(18.095));
console.log(logResult(12.991));
console.log(logResult(12.191));
console.log(logResult(12.990));
console.log(logResult(12.910));
console.log(logResult(12.440));
console.log(logResult(12.441));
console.log(logResult(12.921));
console.log(logResult(67.445));
console.log(logResult(57.244));
console.log(logResult(58.344));
console.log(logResult(69.195));

31
задан Andy White 30 September 2010 в 03:46
поделиться

8 ответов

SOAP разработан для краткого обзора для использования других транспортов помимо HTTP. Это означает, среди прочего, что не использует в своих интересах определенные аспекты HTTP (ГЛАВНЫМ ОБРАЗОМ УСПОКОИТЕЛЬНОЕ использование URL и методов, например. PUT /customers/1234 или GET /customers/1234).

SOAP также обходит существующие механизмы TCP/IP по той же причине - для транспорта. Снова, это означает, что не может использовать в своих интересах транспорт, такой как управление последовательностью, управление потоком, сервисное исследование (например. accept()луг соединение на закрепленном порте означает сервис, существует), и т.д.

SOAP использует XML для всей его сериализации - в то время как это означает, что данные "универсально читаемы" только с синтаксическим анализатором XML, это представляет так много шаблона, что Вам действительно нужен синтаксический анализатор SOAP для функционирования эффективно. И в той точке, Вы (как потребитель программного обеспечения) потеряли преимущество XML так или иначе; кто заботится о том, на что полезная нагрузка похожа по проводу, если Вам нужно libSOAP обработать его так или иначе.

SOAP требует WSDL для описания интерфейсов. Сам WSDL не является проблемой, но он имеет тенденцию рекламироваться как намного более "динамичный", чем это действительно. Во многих случаях единственный WSDL создается, и код производителя/потребителя автоматически генерируется от этого, и он никогда не изменяется. В целом, это требует большого количества инструментов вокруг, на самом деле не решая исходную проблему (как связаться между различными серверами), немного лучше. И так как большинство сервисов SOAP работает на основе HTTP, исходная проблема была уже главным образом решена для начала.

51
ответ дан 27 November 2019 в 21:37
поделиться

Я соглашаюсь с первым плакатом, но хотел бы добавить к нему. Толстое и тонкое определение относительно. С транспортами как JSON или REST, появляющийся, SOAP выглядит тяжелым на поверхности для "привет мировых" примеров. Теперь, поскольку Вы могли бы уже знать то, что делает SOAP тяжелым, и WS 2.0 в целом является функциями предприятия / устойчивыми функциями. JSON не безопасен таким же образом, что WS 2.0 может быть. Я не услышал SOAP, называемый толстым, но много не XML гаек взгляд на эти спецификации как тяжелый или толстый. Чтобы быть ясным, я не говорю за или против ни одного, поскольку оба имеют свое место. XML, более подробный и человекочитаемый и таким образом "более толстый". Последняя часть то, что некоторые люди представление HTTP сохраняющийся протокол подключения, чтобы быть тяжелыми данными более новыми веб-тенденциями как Ajax вместо того, чтобы подать на большой странице. Соединение наверху большое данный нет действительно никакого преимущества.

Таким образом, никакая настоящая причина кроме кого-то не хочет назвать SOAP/HTTP толстым, это - весь родственник. Меньше стандартов идеально подходит и для всех сценариев. Если я должен был предположить, что некоторый умный веб-разработчик думает, что он, о, так умен путем разговора о том, как думают, что технологии XML и как супер JSON. У каждого есть место.

6
ответ дан 27 November 2019 в 21:37
поделиться

SOAP и WSDL являются чрезвычайно сложными стандартами, которые имеют много реализаций, которые поддерживают различные подмножества стандартов. SOAP не отображается очень хорошо на простой внешний функциональный интерфейс таким же образом, что XML-RPC делает. Вместо этого необходимо понять о пространствах имен XML, конвертах, заголовках, WSDL, XML-схемах, и так далее для создавания корректных сообщений SOAP. Все, что необходимо сделать для вызова сервиса XML-RPC, должно определить и конечная точка и назвать метод на ней. Например, в Ruby:

require 'xmlrpc/client'

server = XMLRPC::Client.new2("http://example.com/api")
result = server.call("add", 1, 2)

Помимо XML-RPC, существуют другие методы, которые могут также быть намного более простыми и легкими, такой столь же простой XML или JSON по HTTP (часто называемый как REST, хотя это подразумевает определенные другие конструктивные соображения). Преимущество чего-то как XML или JSON по HTTP состоит в том, что это просто в использовании от JavaScript или даже просто немой веб-страницы с представлением формы. Это может также быть задано сценарием легко из командной строки с инструментами как завихрение. Это работает с примерно любым языком как библиотеки HTTP, библиотеки XML, и библиотеки JSON доступны почти везде, и даже если синтаксический анализатор JSON не доступен, очень легко записать Ваше собственное.

Править: Я должен разъяснить, что обращаюсь к тому, как концептуально тяжелый SOAP, в противоположность тяжелому весу, который это с точки зрения необработанного объема данных. Я думаю, что необработанный объем данных менее важен (хотя он складывает быстрый, если необходимо обработать много маленьких запросов), в то время как то, как концептуально тяжелый это, довольно важно, потому что это означает, что существует намного больше мест, где что-то может пойти не так, как надо, где может быть несовместимость и т.д.

20
ответ дан 27 November 2019 в 21:37
поделиться

Отношение сигнал-шум SOAP является слишком низким. Для простого разговора существует слишком много структурных издержек без значения данных; и существует слишком много явной требуемой конфигурации (по сравнению с неявной конфигурацией, как JSON).

Это не начало тот путь, но это закончило тем, что было ребенком плаката для того, что происходит с хорошей идеей, когда комитет по стандартам принимает участие.

5
ответ дан 27 November 2019 в 21:37
поделиться

В первую очередь, это во многом зависит от того, как Ваши сервисы реализованы (т.е. можно сделать много для сокращения полезной нагрузки, просто будучи остерегающимися того, как сигнатуры методов сделаны).

Тем не менее не только конверт мыла, но и само сообщение могут быть намного более большими в xml, а не оптимизированном двоичном формате. Просто выбор правильного класса и имен элемента может уменьшить его много...

Рассмотрите следующие примеры сериализированных возвратов метода из методов, возвратив набор материала. Просто выбрав право [сериализация] название классов/оберток и участников может иметь большое значение в многословии сериализированного запроса/ответа мыла при возврате повторенных данных (например, списки/наборы/массивы).

Резюме / краткие названия:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfShortIDName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">
  <ShortIDName>
    <id>0</id>
    <name>foo 0</name>
  </ShortIDName>
  <ShortIDName>
    <id>1</id>
    <name>foo 1</name>
  </ShortIDName>
  <ShortIDName>
    <id>2</id>
    <name>foo 2</name>
  </ShortIDName>
  ...
</ArrayOfShortIDName>

Длинные имена:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfThisClassHasALongClassNameIDName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">
  <ThisClassHasALongClassNameIDName>
    <MyLongMemberNameObjectID>0</MyLongMemberNameObjectID>
    <MyLongMemberNameObjectName>foo 0</MyLongMemberNameObjectName>
  </ThisClassHasALongClassNameIDName>
  <ThisClassHasALongClassNameIDName>
    <MyLongMemberNameObjectID>1</MyLongMemberNameObjectID>
    <MyLongMemberNameObjectName>foo 1</MyLongMemberNameObjectName>
  </ThisClassHasALongClassNameIDName>
  <ThisClassHasALongClassNameIDName>
    <MyLongMemberNameObjectID>2</MyLongMemberNameObjectID>
    <MyLongMemberNameObjectName>foo 2</MyLongMemberNameObjectName>
  </ThisClassHasALongClassNameIDName>
  ...
</ArrayOfThisClassHasALongClassNameIDName>
3
ответ дан 27 November 2019 в 21:37
поделиться

1 - XML-схемы, которые являются ключевой ролью спецификации WSDL, действительно, действительно большие и сложны. На практике Вы, которых инструменты, которые делают вещи как XML-схема карты на язык программирования, создают только, заканчиваете тем, что поддерживали часть функций XML-схемы.

2 - WS -* спецификации, например, безопасность WS и WS-SecureConversation, является снова большим и сложным. Они почти разработаны так, чтобы никто не был меньше ресурсов, чем Microsoft или IBM когда-либо могли бы реализовать их полностью.

3
ответ дан 27 November 2019 в 21:37
поделиться

Я думаю, что это главным образом, что конверт SOAP добавляет большую сумму издержек к построению сообщения, специально для общего падежа простого запроса только с некоторыми, not-deeply-structured параметры. Сравните это к REST разрабатывает веб-сервис, где параметры просто включены в запрос URL.

Затем добавьте к этому сложность WSDL и типичных реализаций библиотеки "предприятия"...

1
ответ дан 27 November 2019 в 21:37
поделиться

Я считал это "толстым" из-за относительно больших издержек связанный с упаковкой и распаковкой сообщения (сериализация и десериализация).

Считайте веб-сервис с веб-методом названным Add это берет два 32-разрядных целых числа. Пакеты вызывающей стороны два целых числа и получают единственное целое число в ответ. Где существует действительно только 96 битов передаваемой информации, добавление пакетов SOAP, вероятно, добавит приблизительно 3,000 или больше дополнительных битов в каждом направлении. 30x увеличение.

Добавленный к этому относительно медленная производительность, связанная с сериализацией и десериализацией сообщения в UTF-8 (или безотносительно) XML. По общему признанию это довольно быстро в эти дни, но это, конечно, не тривиально.

2
ответ дан 27 November 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: