Jump to content
Калькуляторы

Macroscop REST API - ошибка при выполнении PUT-запроса

Столкнулся с загадочным глюком.

Может кто тоже сталкивался?

 

Есть Макроскоп Ультра версии 3.5.

Делаю скрипт, который будет управлять пользователями.

Скрипт на PHP, используется библиотека curl, для сериализации используется json.

 

Запросы на получение данных (GET), добавление нового пользователя (POST), удаление пользователя (DELETE) выполняются успешно.

Запрос на изменение пользователя (PUT) не выполняется, прерывается по таймауту. В серверных логах есть исключение, но по логам понять его причину не получается.

 

Скрипт выполняет PUT-запрос к ресурсу /configure/users и передает в него следующую строку:

[{"Id":"344db01a-4884-4f27-9bd1-ad3d4d0f9e80","Login":"tmp2"}]

Это строка уже после сериализации (переменная $data из строчки curl_setopt($this->curl, CURLOPT_POSTFIELDS, $data)).

В ответ тишина, затем таймаут и ошибка "Recv failure: Connection reset by peer".

Но если эту же строчку скопировать в буфер и подставить в такой же запрос в Postman — запрос выполняется успешно.

 

Скрипт при выполнении запроса задает только заголовок Authorization и Content-Type (ну и то, что curl сам добавляет).

В Postman все заголовки только автоматические, дополнительных нет.

821633617_remmina_work-backup_192_168.1.30_2022913-82539557173.thumb.png.c0b153f2051b18d192b75ae61d7158b7.png

 

Какой-либо значимой разницы я не замечаю.

ТП тоже разницы не видит, но сваливает все на ошибки скрипта.

 

Share this post


Link to post
Share on other sites

А вот заголовки, которые отправляет curl:

> PUT /configure/users HTTP/1.1
Host: xx.xx.xx.40:8080
Accept: */*
Authorization: xxxxxxxxxxxxxxxxx
Content-Type: application/json; charset=utf-8
Content-Length: 62
Expect: 100-continue

Дело не в Expect; вручную убирал его в скрипте, добавлял в Postman — все так же.

Share this post


Link to post
Share on other sites

Вот еще рабочий вариант для командной строки:

curl -v --location --request PUT 'xxxx/configure/users' \
--header 'Authorization: xxxx' \
--header 'Content-Type: application/json' \
--header 'Expect: 100-continue' \
--header 'User-Agent:' \
--data-raw '[{"Id":"344db01a-4884-4f27-9bd1-ad3d4d0f9e80","Login":"tmp2"}]'

И результат:

*   Trying xxxx...
* TCP_NODELAY set
* Connected to xxxx port 8080 (#0)
> PUT /configure/users HTTP/1.1
> Host: xxxx
> Accept: */*
> Authorization: xxxx
> Content-Type: application/json
> Expect: 100-continue
> Content-Length: 62
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 100 Continue
* We are completely uploaded and fine
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Length: 2
< Content-Type: text/json
< Server: Microsoft-HTTPAPI/2.0
< Date: Tue, 13 Sep 2022 09:10:29 GMT
< 
* Connection #0 to host xxxx left intact

Разницы между нерабочим вариантом (скрипт) и рабочим я не вижу.

В чем может быть разница?

Share this post


Link to post
Share on other sites

Интересный глюк.

У меня запрос подготавливался так:

curl_setopt($this->curl, CURLOPT_PUT, true);

Переделал так:

curl_setopt($this->curl, CURLOPT_CUSTOMREQUEST, "PUT");

Теперь работает.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.