alibek Posted September 13, 2022 Столкнулся с загадочным глюком. Может кто тоже сталкивался? Есть Макроскоп Ультра версии 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 все заголовки только автоматические, дополнительных нет. Какой-либо значимой разницы я не замечаю. ТП тоже разницы не видит, но сваливает все на ошибки скрипта. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alibek Posted September 13, 2022 А вот заголовки, которые отправляет 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 — все так же. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alibek Posted September 13, 2022 Вот еще рабочий вариант для командной строки: 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 Разницы между нерабочим вариантом (скрипт) и рабочим я не вижу. В чем может быть разница? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alibek Posted September 14, 2022 Интересный глюк. У меня запрос подготавливался так: curl_setopt($this->curl, CURLOPT_PUT, true); Переделал так: curl_setopt($this->curl, CURLOPT_CUSTOMREQUEST, "PUT"); Теперь работает. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
dr Tr0jan Posted October 9, 2022 On 9/14/2022 at 3:05 PM, alibek said: CURLOPT_PUT This option is deprecated since version 7.12.1. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...