powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / ibec_http
25 сообщений из 47, страница 1 из 2
ibec_http
    #39893831
OrsoF1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Нигде не могу найти, как правильно устанавливать http-заголовки, при вызове функции ibec_http_Post(), например? Функции типа ibec_http_SetHeader() или чего-то похожего не нашел, пробовал разные вариации установки заголовков в ibec_http_OpenSession(), но не снискал счастья. Нашел на форуме один пример по передаче xml методом ibec_http_Post(), но там заголовки не устанавливаются при вызове. Помогите, будьте так добры, кто пользовался этими замечательными функциями, как правильно построить запрос с нужными http-заголовками?
...
Рейтинг: 0 / 0
ibec_http
    #39894375
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что за заголовки? Поясни на простом примере.
...
Рейтинг: 0 / 0
ibec_http
    #39894834
OrsoF1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Шаблон POST-запроса для передачи JSON на регистратор выбытия системы маркировки лекарственный препаратов.

POST /v1/requests HTTP/1.1
Authorization: Basic {Base64Str}
Content-Type: application/json; charset=UTF-8
Accept: application/json
Content-Length: BodyLen
{JSON Body}

То бишь мне надо HTTP-серверу рассказать в хидере, чего именно я ему буду передавать, ну и авторизоваться тоже надо. Вот эти самые хидеры как ставить?

P.S. Например если я через WinHTTPRequest делаю запрос на HTTP-сервер. Я значала делаю
Open()
затем
setRequestHeader() <- тут как раз прописываю заголовок
затем
Send(POSTBody) <- отправка запроса
...
Рейтинг: 0 / 0
ibec_http
    #39895208
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OrsoF1

То бишь мне надо HTTP-серверу рассказать в хидере, чего именно я ему буду передавать, ну и авторизоваться тоже надо. Вот эти самые хидеры как ставить?


Часть автоматом генерируется. User/Pass для Authorization берется из URL. Content-Length тоже автоматом выставляется по размеру данных в ibec_http_post.
В общем, как я понял, нужна возможность задать произвольный заголовок перед POST. В принципе, это не сложно, вроде бы. Завтра попробую.

ЗЫ. Я правильно понимаю, что в работу идет последний заголовок с одним и тем же именем? Т.е., если в заголовках прописано

Content-Length: 123
Content-Length: 321

то сервер будет смотреть на последний??
...
Рейтинг: 0 / 0
ibec_http
    #39895327
OrsoF1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе утро.

IBExpert

...В общем, как я понял, нужна возможность задать произвольный заголовок перед POST...

Ну не только перед POST, перед GET тоже.
IBExpert

...то сервер будет смотреть на последний?

Заголовки с одинаковыми названиями параметров, но разными значениями могут объединяться в один, но только если значение есть список, разделенный запятыми. Во всех остальных случаях значения более дальних заголовков перекрывают предыдущие.
...
Рейтинг: 0 / 0
ibec_http
    #39895418
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можешь попробовать в свежей версии ibec_http_SetHeader. После ее вызова в заголовках будет только то, что ты в нее передал. А перед POST/GET там еще автогенерация заголовков есть, она вставит свое ПЕРЕД твоими.
...
Рейтинг: 0 / 0
ibec_http
    #39895471
OrsoF1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert
Можешь попробовать в свежей версии ibec_http_SetHeader. После ее вызова в заголовках будет только то, что ты в нее передал. А перед POST/GET там еще автогенерация заголовков есть, она вставит свое ПЕРЕД твоими.


Чутка бы подробностей по использованию, как правильно то передавать туда параметры и значения? Вызывать функцию последовательно, или всё в одной строке? Я попробовал так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 
 url   = 'URL=https://api.mdlp.crpt.ru/api/v1/reestr/sgtin/filter';
 sess  = ibec_http_OpenSession(:url);

 ibec_http_SetHeader(:sess,'Authorization: token 4dc677ab-b0d1-4c11-a16a-e5b3f3e51842');
 ibec_http_SetHeader(:sess,'Content-Type: application/json');

 ibec_http_Post(:sess,ibec_AnsiStringToUTF8('{"filter": {"sgtin" : "0460190700319210E04K5C22T9C"},"start_from": 0,"count": 1}'));
 scode = ibec_http_StatusCode(:sess);
 sdesc = ibec_http_Data(:sess);

 if (ibec_http_GetHeader(:sess)) then
  ibec_ShowMessage(:scode||'  '||:sdesc);
 else
  ibec_ShowMessage('Что-то пошло не так '||:scode||'  '||:sdesc);

 ibec_http_CloseSession(:sess);



Мне возвращается 500 от сервера, т.е. он не может переварить данный запрос. Ровно такой же в точности запрос через WinHTTPRequest возвращает мне корректный JSON с описанием препарата. Что делаю не так?

P.S. К сожалению токен, указанный в авторизации моего запроса, живет только 30 минут ибо таковы настройки http-сервера ИС МДЛП, он на данный момент действующий, но...

P.P.S Кстати, а что происходит при вызове ibec_http_OpenSession()? Чудится мне (глядя на пример с проверкой последней версии IBExpert через ibec_http_xxx), там сразу же идет GET к серверу? Или я ошибаюсь?
...
Рейтинг: 0 / 0
ibec_http
    #39895484
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OrsoF1

Чутка бы подробностей по использованию, как правильно то передавать туда параметры и значения? Вызывать функцию последовательно, или всё в одной строке? Я попробовал так:


Все в одной строке, правильно сформатированное. Т.е., после каждого заголовка должен быть перевод строки или что там должно быть. А как ты пробовал, так в заголовках останется только то, что в последнем вызове было.
Думал, это очевидно, ведь ibec_http_GetHeader возвращает тебе заголовки именно одной строкой. Вот так же их и нужно скармливать ibec_http_SetHeader.

OrsoF1
P.P.S Кстати, а что происходит при вызове ibec_http_OpenSession()? Чудится мне (глядя на пример с проверкой последней версии IBExpert через ibec_http_xxx), там сразу же идет GET к серверу? Или я ошибаюсь?


Ничего там еще не происходит, кроме разбора переданных опций.
...
Рейтинг: 0 / 0
ibec_http
    #39895488
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OrsoF1,

ну ты на стороне сервера заголовки логируй. Увидишь что не так
...
Рейтинг: 0 / 0
ibec_http
    #39895536
OrsoF1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис
OrsoF1,

ну ты на стороне сервера заголовки логируй. Увидишь что не так


Ну на серверах ИС МДЛП федерального проекта маркировки лекарственных препаратов, мне хрен кто даст чего логировать ))
Потестирую завтра на своем web-сервере, отпишусь, что будет получаться...
...
Рейтинг: 0 / 0
ibec_http
    #39895562
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OrsoF1,

ах эти... маркировшики сочувствую. Тоже боремся
...
Рейтинг: 0 / 0
ibec_http
    #39897156
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и? Результаты-то какие??
...
Рейтинг: 0 / 0
ibec_http
    #39900546
OrsoF1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Добрался наконец до протестировать на своем web-сервере, есть у меня небольшой сервис с моим api для обмена данными с мед. организациями, так вот передаю на него xml-пакет авторизации вот так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
execute ibeblock
as
begin
 xml = ibec_LoadFromFile('C:\temp\test_http\auth.xml');
 url  = 'URL=https://restlgota.ru/testapi/v1/test_auth';
 sess   = ibec_http_OpenSession(:url);
 header = 'cache-control: no-cache'||ibec_CRLF()||'content-type: text/xml';
 ibec_http_SetHeader(:sess,:header);
 ibec_http_Post(:sess,xml);
 scode = ibec_http_StatusCode(:sess);
 sdesc = ibec_http_Data(:sess);
 ibec_ShowMessage('Ответ: '||:scode||'  '||ibec_UTF8ToAnsiString(:sdesc));
 ibec_http_CloseSession(:sess);
end



На сервере ловлю заголовки, и смотрю ответ сервера:

***********************************************************
REQUEST_URI:/testapi/v1/test_auth
CONTENT_TYPE:Application/octet-stream, text/xml
CONTENT_LENGTH:394
REQUEST_METHOD:POST
API_METHOD:test_auth
Auth OK
***********************************************************

Что вижу, запрос отработал, аутентификация прошла и сервер вернул на клиента токен в ответном xml, тут всё ок. По заголовкам: при попытке самостоятельно установить content-length на сервер прилетает конструкция вида:
content-length: 394, 394
и т.к. данный параметр не может иметь ряд значений, сервер ругается. Т.е. видимо, при вызове ibec_http_Post(), устанавливаются автоматические заголовки, при этом не проверяется, можно ли для данного заголовка передавать ряд значений через запятую, или нет. Далее, как видно в content-type к тому заголовку, что я передаю явно 'text/xml', добавился так же 'Application/octet-stream'. В принципе это не критично, если сервер, который будет обрабатывать заголовки, не делает строгих проверок на конкретно заданный content-type. Например мой сервер как раз таки эту проверку делал и не пропускал запрос, пока я не переделал проверку на вхождение нужного мне типа контента в заголовок content-type, а не на полное соответствие заголовка нужному типу. Насколько я понимаю ряд заголовков устанавливается автоматически при вызове ibec_http_Post(). Например, тот же content-length явно раньше установить негде ибо тело запроса только тут появляется. Предложение: если какой-либо заголовок был установлен функцией ibec_http_SetHeader(), то нигде дальше данный заголовок не нужно дополнять/изменять/удалять, корректность данного заголовка должна оставаться на совести кодера, который его поставил. Таким образом избегаем неоднозначности при прописывании заголовков, кодер будет уверен, что в заголовке именно то, что он прописал, и это не изменится, а если какой-то необходимый заголовок вручную установлен не был, опять же content-length, то прописывать его автоматически как сейчас и происходит.
...
Рейтинг: 0 / 0
ibec_http
    #39900549
OrsoF1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В дополнение к предыдущему сообщению: запрос на сервер ИС МДЛП отправить так и не удалось. При установке всех заголовков ровно так же, как делаю при обращении через WinHTTPRequest, сервер возвращает 500, видимо какой-то заголовок таки он не может правильно переварить, но где и почему точно сказать не могу т.к., понятно, что на их серверах заголовки не залогировать. В связи с этим, думаю, что предложенное в предыдущем сообщении поведение при работе с заголовками, будет верным.
...
Рейтинг: 0 / 0
ibec_http
    #39900554
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OrsoF1

По заголовкам: при попытке самостоятельно установить content-length на сервер прилетает конструкция вида:
content-length: 394, 394


А зачем ты его самостоятельно устанавливаешь?

OrsoF1

Предложение: если какой-либо заголовок был установлен функцией ibec_http_SetHeader(), то нигде дальше данный заголовок не нужно дополнять/изменять/удалять


Это уже совсем не на пять минут работа, нужно лезть в потроха компонентов и ковырять их.
Но для начала хотелось бы понять, зачем тот же content-length нужно извне задавать.
...
Рейтинг: 0 / 0
ibec_http
    #39900557
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В свежей версии после post вызови ibec_http_GetProperty:

sHdr = ibec_http_GetProperty(sess, 'LastSentHeaders');

Она вернет тебе текст заголовков, отправленных на сервер.
У себя я, кстати, не вижу никаких "content-length: 394, 394". Если я устанавливаю свой content-length, то он идет в списке заголовков отдельной строкой и после такого же автозаголовка.
...
Рейтинг: 0 / 0
ibec_http
    #39900566
OrsoF1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выполняю такой скрипт

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
execute ibeblock
as
begin
 json = '{"filter":{"sgtin":"046700124610051059C43A31A82"},"start_from":0,"count":1}';
 url  = 'URL=https://api.mdlp.crpt.ru/api/v1/reestr/sgtin/filter';
 sess   = ibec_http_OpenSession(:url);
 header = 'Authorization: token 6006af8e-91e4-4350-a903-0886908fd771'||ibec_CRLF()||'Content-Type: application/json';
 ibec_http_SetHeader(:sess,:header);
 ibec_http_Post(:sess,:json);
 lHeaders = ibec_http_GetProperty(sess, 'LastSentHeaders');
 ibec_ShowMessage(:lHeaders);
 scode = ibec_http_StatusCode(:sess);
 sdesc = ibec_http_Data(:sess);
 ibec_ShowMessage('Ответ: '||:scode||'  '||ibec_UTF8ToAnsiString(:sdesc));
 ibec_http_CloseSession(:sess);
end



в ibec_ShowMessage(:lHeaders); получаю пустое сообщение.



IBExpert

В свежей версии после post вызови ibec_http_GetProperty:
sHdr = ibec_http_GetProperty(sess, 'LastSentHeaders');
Она вернет тебе текст заголовков, отправленных на сервер.
У себя я, кстати, не вижу никаких "content-length: 394, 394". Если я устанавливаю свой content-length, то он идет в списке заголовков отдельной строкой и после такого же автозаголовка.


А как сервер будет интерпретировать два одинаковых заголовка с разными значениями? Вот и я думаю, что он преобразует это в один заголовок со списком значений через запятую...
...
Рейтинг: 0 / 0
ibec_http
    #39900575
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OrsoF1

в ibec_ShowMessage(:lHeaders); получаю пустое сообщение.


Ты точно обновил свой эксперт? У меня все работает, я проверял.

OrsoF1

А как сервер будет интерпретировать два одинаковых заголовка с разными значениями?


Я не знаю, поэтому и спрашивал тебя об этом в начале темы. Сейчас надо понять, в чем именно проблема, а потом уже думать, как ее решать.
...
Рейтинг: 0 / 0
ibec_http
    #39900576
OrsoF1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обновил. Сейчас версия 2019.12.10.1, я так понимаю это сегодняшняя?
...
Рейтинг: 0 / 0
ibec_http
    #39900579
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OrsoF1
Обновил. Сейчас версия 2019.12.10.1, я так понимаю это сегодняшняя?


Ну да, все верно. Тогда странно...
A, вот на твоем примере у меня тоже пусто выдает. Сейчас посмотрю, в чем там дело.
...
Рейтинг: 0 / 0
ibec_http
    #39900580
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, там до post дело и не доходит, на коннекте к серверу все заканчивается.
...
Рейтинг: 0 / 0
ibec_http
    #39900586
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче, я не знаю, почему он обламывается на коннекте, и сервер выдает 500.
Думал, может поддержка HTTPS отвалилась, так нет, на другом скрипте все работает. Да и на твоем веб-сервере вроде ОК все?
...
Рейтинг: 0 / 0
ibec_http
    #39900599
OrsoF1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, да, на моем всё хорошо через https. А у тебя ibec_http_xxx() функции это обертка для чего-то виндозного, или ты там полностью сам протокол реализуешь?
...
Рейтинг: 0 / 0
ibec_http
    #39900605
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OrsoF1
А у тебя ibec_http_xxx() функции это обертка для чего-то виндозного, или ты там полностью сам протокол реализуешь?


Это обертка над Synapse
http://www.ararat.cz/synapse/

Обламывается оно с установкой ssl-соединения с сервером, возвращает ошибку 10091.
...
Рейтинг: 0 / 0
ibec_http
    #39900623
OrsoF1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, ну тут, вполне вероятно, особенности работы сервера ИС МДЛП. Дело в том, что для доступа к нему должен использоваться TLS1.2 если для Synapse не включена поддержка, то будет ошибка. Тут наткнулся на форум, может поможет?

http://www.cyberforum.ru/delphi-networks/thread2114727.html
...
Рейтинг: 0 / 0
25 сообщений из 47, страница 1 из 2
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / ibec_http
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]