Синтаксис fetch типа POST c application/json

Обсуждение ПО и его настройки
Ответить
mikhan
Сообщения: 2
Зарегистрирован: 25 мар 2021, 07:03

Пишу скрипт для 6in4 для автообновления адреса через post запрос.
Собственно запрос для курла такой:
curl -v --request PUT \
--url https://6in4.ru/tunnel/%API%/%ID% \
--header 'Content-Type: application/json' \
--data '{"ipv4remote": "%IP%"}'
под линуксом запрос курлом работает, а вот в микротик такая конструкция нет:

Код: Выделить всё

:local api "blahblah";
:local id "12345678";
:local i;
:local p;
:set i [/ip cloud get public-address];
:set p "{\"ipv4remote\":\"$i\"}";

#проверяю значение переменных
:put $api;
:put $id;
:put $i;
:put $p;
#конец проверки

/tool fetch http-method=post http-header-field="Content-Type:application/json" http-data="$p" url="https://6in4.ru/tunnel/$api/$id" keep-result=no;
ошибка 400

В винде аналогичная ошибка, связанная с экранированием символов, здесь похоже так же:
* upload completely sent off: 29 bytes
< HTTP/1.1 400 Bad Request
< Server: nginx/1.27.0
< Date: Wed, 21 Aug 2024 17:40:05 GMT
< Content-Type: application/json; charset=utf-8
< Content-Length: 68
< Connection: keep-alive
< X-XSS-Protection: 1; mode=block
< X-Content-Type-Options: nosniff
< Cache-Control: no-transform
< Referrer-Policy: no-referrer
<
{"message":"invalid character '\\'' looking for beginning of value"}* Connection #0 to host 6in4.ru left intact

ЧЯДНТ?


mikhan
Сообщения: 2
Зарегистрирован: 25 мар 2021, 07:03

Отвечу сам себе. Микротик в пут запросе зачем-то формирует "лишние" хэдеры accept и accept-encoding с непустым содержимым, которое не нравится серверу.
Если выставить хэдеры в явном виде типа "accept: */*,accept-encoding:*", то все работает в итоге.

Рабочий кусок скрипта такой:

Код: Выделить всё

:local api "API_KEY";
:local id "TUNNEL_ID";

:local i;
:local p;

:set i [/ip cloud get public-address];
:set p ("{\"ipv4remote\":\"$i\"}");

:local url "https://6in4.ru/tunnel/$api/$id";
:local ct "Content-Type: application/json,accept: */*,accept-encoding:*"
:local method "put";

/tool fetch http-method=$method http-header-field=$ct http-data=$p url=$url;


Ответить