Content length как вычислить в 1с

Обновлено: 04.07.2024

Библиотека xnet.dll добавить Content-Length
В общем не совсем понятно как добавить этот параметр. Пробую добавить в хидер - выдается ошибка.

Уточните насчет заголовка Content-Length в запросе
Прочитал что в заголовке Content-Length указано число октетов(байтов) запроса(request). Имеется.

Библиотека xNet - как установить заголовок Content-Length = 0?
Кто пользовался библиотекой xNet - как установить Content-Length = 0? В библиотеке этот заголовок.

а каким образом ваш обработчик связан с обработчиком 1cws ? а каким образом ваш обработчик связан с обработчиком 1cws ?

Я в web.config добавил модуль. Как я понял там идёт конвеерная архитектура. Первый собрал, второй добавил, третий добавил, отправилось всё. По идее должно получаться так обработчик передал управление dll, длл подконектилась к 1с, 1ска сконструировала ответ, отдала его. Потом всё передаётся модулю. - Ну это только мои мысли. На самом же деле всё происходит несколько иначе. Ответ конструируется, но он болтается неизвестно где и неизвестно как его измерить.

PS Прогоны показали, что реально если сделать Responce.Write("123") в BeginRequest, то перед обработкой 1сws появится "123", если EndRequest, то после обработки "123". Но я удивляюсь, как обработчик умудряется обойти Filter. Туда не записывается ни бита.

POST запрос через JS имеет Content-Length: 0, по клику работает нормально. Chrome + FireFox
И в Хроме и в Лисе если отправляю форму через JS по form.submit() то она отправляется пустой с.


Warning: POST Content-Length of 13305751 bytes exceeds the limit of 8388608 bytes in Unknown on line 0
Вот такая ошибка красуется на странице, но при этом в php.ini upload_max_filesize = 20M.

Content-Language и Content-Type для оптимизации
Есть сайт на котором норм кол-во страниц но яндекс почему-то проиндексировал лишь 5 из них на всех.

  • PROPFIND - Получение свойств объекта на сервере в формате XML. Также можно получать структуру репозитория (дерево каталогов);
  • PROPPATCH - Изменение свойств за одну транзакцию;
  • MKCOL - Создать коллекцию объектов (каталог в случае доступа к файлам);
  • COPY - Копирование из одного URI в другой;
  • MOVE - Перемещение из одного URI в другой;
  • LOCK - Поставить блокировку на объекте. WebDAV поддерживает эксклюзивные и общие (shared) блокировки;
  • UNLOCK- Снять блокировку с ресурса.

Подробнее о методах можно почитать тут и тут

Давайте обратим внимание на метод «ANY (Любой)» - Данный метод позволяет перехватывать любой метод и обрабатывать его.

Для начала создадим Демо базу на основе БСП 2.4.6.146 (на платформе 8.3.10), добавим в нее расширении из предыдущей части, изменим Корневой URL на PAPI и добавим метод "Любой (ANY)".



Обратите внимание на заголовок "Content-Type" (Код обработчика PAPI_ALL). Данный заголовок содержит тип данных и служит для того чтобы можно было понять, что находится в запросе или ответе. Про возможные типы можно почитать тут. мы укажем "text/plain; charset=utf-8" - текстовые данные.

Шаблон у нас будет такой: /



Создадим, если ранее не создавали Демо базу на основе БСП 3.0.1.231 (на платформе 8.3.12), и создадим небольшую внешнюю обработку с одной командой ВсеМетоды и реквизитом Результат с типом строка.


Проверяем результат:

Из логов видно, что все запросы кроме запроса с методом TRACE отработали и с телом запроса и без.

Результаты метода ANY:

Заголовки:
Host:127.0.0.1
User-Agent:1C+Enterprise/8.3
Accept:*/*
Authorization:Basic 0JDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YA6
Content-Length:0

Параметры URL:
ИмяМетода:GET

Параметры запроса:
parametr1:13
parametr2:test

Заголовки:
Host:127.0.0.1
User-Agent:1C+Enterprise/8.3
Accept:*/*
Authorization:Basic 0JDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YA6
Content-Length:0

Параметры URL:
ИмяМетода:GET

Параметры запроса:
parametr1:13
parametr2:test

Метод отработал в обоих случаях одинаково, тело запроса не было передано. Так и заявлено в методе.

Метод отработал в обоих случаях одинаково, тело ответа не было передано. Так и заявлено в методе.

Заголовки:
Host:127.0.0.1
User-Agent:1C+Enterprise/8.3
Accept:*/*
Authorization:Basic 0JDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YA6
Content-Length:0

Параметры URL:
ИмяМетода:PUT

Параметры запроса:
parametr1:13
parametr2:test

Заголовки:
Content-Type:application/octet-stream
Host:127.0.0.1
User-Agent:1C+Enterprise/8.3
Accept:*/*
Authorization:Basic 0JDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YA6
Content-Length:49
Expect:100-continue

Параметры URL:
ИмяМетода:PUT

Параметры запроса:
parametr1:13
parametr2:test

Тело запроса:
Тело Запроса - просто текст

Метод отработал в обоих случаях, поймать ситуацию из статьи Отправка PUT запроса средствами 1С 8.3 когда PUT 1С-Кой менялся на HEAD не удалось. Наверное была ошибка платформы которую исправили.

Content-Length - указывает размер тела объекта в десятичном числе октетов (байтов)

Expect - указывает ожидания, которые должен выполнить сервер, чтобы правильно обработать запрос.

Единственным ожиданием, определенным в спецификации, является "Expect: 100-continue", на который сервер должен ответить:

    если информации, содержащейся в заголовке, достаточно, чтобы вызвать немедленный успех, (Expectation Failed) если он не может удовлетворить ожидания; или любой другой статус 4xx..

Например, сервер может отклонить запрос, если его Content-Length слишком большой.

Заголовки:
Content-Type:application/octet-stream
Host:127.0.0.1
User-Agent:1C+Enterprise/8.3
Accept:*/*
Authorization:Basic 0JDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YA6
Content-Length:0

Параметры URL:
ИмяМетода:POST

Параметры запроса:
parametr1:13
parametr2:test

Заголовки:
Content-Type:application/octet-stream
Host:127.0.0.1
User-Agent:1C+Enterprise/8.3
Accept:*/*
Authorization:Basic 0JDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YA6
Content-Length:49

Параметры URL:
ИмяМетода:POST

Параметры запроса:
parametr1:13
parametr2:test

Тело запроса:
Тело Запроса - просто текст

Метод отработал в обоих случаях.

Content-Length - указывает размер тела объекта в десятичном числе октетов (байтов)

Заголовки:
Host:127.0.0.1
User-Agent:1C+Enterprise/8.3
Accept:*/*
Authorization:Basic 0JDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YA6
Content-Length:0

Параметры URL:
ИмяМетода:DELETE

Параметры запроса:
parametr1:13
parametr2:test

Заголовки:
Content-Type:application/octet-stream
Host:127.0.0.1
User-Agent:1C+Enterprise/8.3
Accept:*/*
Authorization:Basic 0JDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YA6
Content-Length:49

Параметры URL:
ИмяМетода:DELETE

Параметры запроса:
parametr1:13
parametr2:test

Тело запроса:
Тело Запроса - просто текст

Метод отработал в обоих случаях.

Content-Length - указывает размер тела объекта в десятичном числе октетов (байтов)

Заголовки:
Host:127.0.0.1
User-Agent:1C+Enterprise/8.3
Accept:*/*
Authorization:Basic 0JDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YA6
Content-Length:0

Параметры URL:
ИмяМетода:PATCH

Параметры запроса:
parametr1:13
parametr2:test

Заголовки:
Content-Type:application/octet-stream
Host:127.0.0.1
User-Agent:1C+Enterprise/8.3
Accept:*/*
Authorization:Basic 0JDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YA6
Content-Length:49

Параметры URL:
ИмяМетода:PATCH

Параметры запроса:
parametr1:13
parametr2:test

Тело запроса:
Тело Запроса - просто текст

Метод отработал в обоих случаях.

Content-Length - указывает размер тела объекта в десятичном числе октетов (байтов)

Заголовки:
Host:127.0.0.1
User-Agent:1C+Enterprise/8.3
Accept:*/*
Authorization:Basic 0JDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YA6
Content-Length:0

Параметры URL:
ИмяМетода:MERGE

Параметры запроса:
parametr1:13
parametr2:test

Заголовки:
Content-Type:application/octet-stream
Host:127.0.0.1
User-Agent:1C+Enterprise/8.3
Accept:*/*
Authorization:Basic 0JDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YA6
Content-Length:49

Параметры URL:
ИмяМетода:MERGE

Параметры запроса:
parametr1:13
parametr2:test

Тело запроса:
Тело Запроса - просто текст

Метод отработал в обоих случаях.

Content-Length - указывает размер тела объекта в десятичном числе октетов (байтов)

Заголовки:
Host:127.0.0.1
User-Agent:1C+Enterprise/8.3
Accept:*/*
Authorization:Basic 0JDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YA6
Content-Length:0

Параметры URL:
ИмяМетода:OPTIONS

Параметры запроса:
parametr1:13
parametr2:test

Заголовки:
Content-Type:application/octet-stream
Host:127.0.0.1
User-Agent:1C+Enterprise/8.3
Accept:*/*
Authorization:Basic 0JDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YA6
Content-Length:49

Параметры URL:
ИмяМетода:OPTIONS

Параметры запроса:
parametr1:13
parametr2:test

Тело запроса:
Тело Запроса - просто текст

Метод отработал в обоих случаях.

Content-Length - указывает размер тела объекта в десятичном числе октетов (байтов)

Заголовки:
Host:127.0.0.1
User-Agent:1C+Enterprise/8.3
Accept:*/*
Authorization:Basic 0JDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YA6
Content-Length:0

Параметры URL:
ИмяМетода:TRACE

Параметры запроса:
parametr1:13
parametr2:test

Заголовки:
Host:127.0.0.1
User-Agent:1C+Enterprise/8.3
Accept:*/*
Authorization:Basic 0JDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YA6
Content-Length:0

Параметры URL:
ИмяМетода:CONNECT

Параметры запроса:
parametr1:13
parametr2:test

Заголовки:
Content-Type:application/octet-stream
Host:127.0.0.1
User-Agent:1C+Enterprise/8.3
Accept:*/*
Authorization:Basic 0JDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YA6
Content-Length:49

Параметры URL:
ИмяМетода:CONNECT

Параметры запроса:
parametr1:13
parametr2:test

Тело запроса:
Тело Запроса - просто текст

Метод отработал в обоих случаях.

Content-Length - указывает размер тела объекта в десятичном числе октетов (байтов)

Как мы видим, часть методов имеет схожее назначение за некоторыми отличиями. Большинство API предоставляют клиентам только методы GET, POST и реже PUT.

Давайте сравним GET и POST:

Параметры сравнения

Запросы можно кэшировать

Могут быть кэшированы браузером.

Запросы сохраняются в истории браузера

Следовательно, если логин и пароль указан в параметрах запроса, злоумышленник без труда их узнает.

При многочисленном повторном обращении вернут один и тот же результат, кроме случаев когда информация устарела.

Безопасные — это методы, которые могут лишь запросить информацию. Они не могут изменить запрашиваемый ресурс, не могут привести к нежелательным результатам для пользователя, других лиц или сервера.

Содержит тело запроса

Для POST параметры передаются в теле.

Можно передавать файлы

Способен передать большие объемы данных

Запрос ограничен длинной URL

Несмотря на то, что RFC не описывает такой параметр, как длина URL, Internet Explorer упорно придерживается мнения, что максимальная длина URL не может превышать 2048 символов, это накладывает некоторые ограничения на использование GET.

Картинка ниже, утрировано, но очень наглядно показывает выбор между GET и POST:


Ссылки по сравнению GET с POST:

Правим, обработчик метода GET, добавляем Метод запроса.

В модуль PAPI_ОбработкаУниверсальныхМетодов добавляем код для нового метода.

Код модуля PAPI_ОбработкаУниверсальныхМетодов

В модуль PAPI_ОбщиеПроцедурыИФункции добавляем функцию ПолучитьДатуВремяИзСтроки - для преобразования данных в дату.

Код модуля PAPI_ОбщиеПроцедурыИФункции

В модуль PAPI_ОбработкаМетодовGET добавляем код обработки метода "ПолучитьСписокЗаданийЗаПериод"

Создаем модуль PAPI_ОбработкаМетодовPOST

Наш сервис готов! Давайте теперь дорисуем обработку и будем тестировать. Обратите внимание, что я оставил метод ANY, по сути, обращение к нему отличается лишь отсутствием в URL "V1/". Данный метод позволит Вам выводить параметры вашего запроса.

Доделаем обработку, которую создавали выше. Добавим реквизиты КонецПериода и НачалоПериода с типом Дата, МетодСервиса с типом Строка и делаем РежимВыбораИзСписка (GET(GET), POST(POST), Проверить(ANY)). Добавляем команду ПолучитьРезультат.


Проверяем:



Заголовки:
Content-Type:application/octet-stream
Host:127.0.0.1
User-Agent:1C+Enterprise/8.3
Accept:*/*
Authorization:Basic 0JDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YA6
Content-Length:71

Параметры URL:
ИмяМетода:ПолучитьСписокЗаданийЗаПериод

Метод: [POST]--

Заголовки:
Host:127.0.0.1
User-Agent:1C+Enterprise/8.3
Accept:*/*
Authorization:Basic 0JDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YA6
Content-Length:0

Параметры URL:
ИмяМетода:ПолучитьСписокЗаданийЗаПериод


Метод: [GET]--

Длительные операции.

Есть случаи, когда мы знаем, что код будет работать долгое время и браузер либо предложит разорвать операцию, либо разорвет ее намеренно (зависит от используемого браузера), либо мы знаем, что результат будет формироваться долгое время и нет смысла держать сеанс (лицензию) и мы просто можем дать задание на выполнение какой либо операции и забрать результат по готовности. 18.4. Особенности выполнения фоновых заданий в файловом и клиент-серверном вариантах.

Давайте для нашего GET метода создадим параметр BTask=True - будет означать, что операцию нужно выполнить используя БСП:Базовая функциональность\Длительные операции. Создадим модуль для асинхронных операций. Создадим метод GET для проверки выполнения фонового задания и получения результата "ФоновоеЗаданиеПроверить" с параметрами Result_Key (Адрес хранилища результата. Обязательный параметр) и Task_Key (Идентификатор фонового задания. Необязательный параметр).

Предлагаю перенести наше разрешение в Демо базу на основе БСП 3.0.1.231 (на платформе 8.3.12). Хочу создать справочник для хранения результатов, что позволит обращаться к результатам хоть через год. Пока не удалят элемент справочника.

Редактируем обработчик PAPI_GET, добавляем в структуру БазовыйURL.

Создаем Справочник.PAPI_ХранилищеРезультатов. Добавляем реквизиты АдресРезультата - Строка(200) и Результат - ХранилищеЗначения


Создаем модуль PAPI_АсинхронныеОперации

Правим модуль PAPI_ОбработкаМетодовGET. Добавляем код для запуска фонового задания и метод получения результата фонового задания.

Код модуля PAPI_ОбработкаМетодовGET

В модуль PAPI_ОбщиеПроцедурыИФункции, добавляем функцию НайтиЗадание.

Код модуля PAPI_ОбщиеПроцедурыИФункции

Проверяем результат, через браузер выполним следующий запрос:


Нажимаем "Ссылка на получение результата"


Была сформирована ссылка на сохраненный результат:

Соответственно можно и без идентификатора задания обращаться:

Третью часть заканчиваю. Мы рассмотрели с Вами методы GET, POST и ANY, создали сервис на основании данных отчета СКД. Сделали возможность запускать фоновое задание через GET и сохранили результат. Данный механизм при должной доработке позволит выдавать одинаковые запросы без обработки запросов.

Especially in case of Content-Type: application/x-www-form-urlencoded .


3,990 3 3 gold badges 28 28 silver badges 39 39 bronze badges


77.5k 74 74 gold badges 299 299 silver badges 487 487 bronze badges

9 Answers 9

It's the number of bytes of data in the body of the request or response. The body is the part that comes after the blank line below the headers.

7,508 2 2 gold badges 20 20 silver badges 25 25 bronze badges

The Content-Length entity-header field indicates the size of the entity-body, in decimal number of OCTETs, sent to the recipient or, in the case of the HEAD method, the size of the entity-body that would have been sent had the request been a GET.

It doesn't matter what the content-type is.

827k 112 112 gold badges 1109 1109 silver badges 1234 1234 bronze badges 13.4k 2 2 gold badges 39 39 silver badges 41 41 bronze badges Combine this answer with the answer from Tom Cabanski and you have all the information you need. In case of text you can count the number of characters since ASCII is 8 bit. @hcpl: but text is not necessarily always ASCII, also ASCII is 7-bit, not 8. @hcpl: the entire reason why the bytes vs. characters issue is significant is due to variable width encodings like UTF-8 and UTF-16 where the "number of bits" is not fixed.

* . or request, in the case of request methods that have a body, such as POST, PUT or PATCH

Alternatively, Content-Length header can be omitted and a chunked Transfer-Encoding header can be used.

If both Content-Length and Transfer-Encoding headers are missing, then at the end of the response the connection must be closed.


109k 30 30 gold badges 213 213 silver badges 328 328 bronze badges "Content-Length header can be omitted and a chunked Transfer-Encoding header can be used" : Literally saved my day. Thank you so much.

One octet is 8 bits. Content-length is the number of octets that the message body represents.


825 1 1 gold badge 7 7 silver badges 13 13 bronze badges

My interpretation is that this means the length "on the wire", i.e. the length of the *encoded" content

78.9k 91 91 gold badges 336 336 silver badges 609 609 bronze badges 32.5k 8 8 gold badges 72 72 silver badges 91 91 bronze badges "On the wire", the length would be altered depending on compression, but it is correct to say the length before being compressed. Will Content-Length differs on different type of machines like Mac/Linux? OR will it differ while using different client like curl/postman .

The most common use of POST, by far, is to submit HTML form data to CGI scripts. In this case, the Content-Type: header is usually application/x-www-form-urlencoded, and the Content-Length: header gives the length of the URL-encoded form data (here's a note on URL-encoding). The CGI script receives the message body through STDIN, and decodes it. Here's a typical form submission, using POST:

22.9k 4 4 gold badges 47 47 silver badges 57 57 bronze badges 3,279 9 9 gold badges 42 42 silver badges 46 46 bronze badges

According to the spec:

53.3k 13 13 gold badges 96 96 silver badges 116 116 bronze badges

Consider if you have headers such as:

The content-length is the size of the compressed message body, in "octets" (i.e. in units of 8 bits, which happen to be "bytes" for all modern computers).

The size of the actual message body can be something else, perhaps 150280 bytes.

The number of characters can be different again, perhaps 150231 characters, because some unicode characters use multiple bytes (note UTF-8 is a standard encoding).

So, different numbers depending on whether you care how much data is transmitted, or how much data is held, or how many symbols are seen. Of course, there is no guarantee that these headers will be provided..

Читайте также: