Я использую Catalyst для создания веб-службы RESTful, поэтому я создаю контроллер Catalyst обычным способом
script/myapp_create.pl controller MyApp::Controller
Я тогда запускаю сервер тестирования катализатора
script/zoo_server.pl -rd
Пока все хорошо - теперь я могу перейти к http://localhost:3000/user
и увидеть сообщение «Соответствует MyApp :: Controller :: User in User».
Затем я заменяю первую строку BEGIN в lib / MyApp / Controller / User.pm на следующую строку
BEGIN { extends 'Catalyst::Controller::REST' }
Прежде чем делать что-либо еще, я хочу проверить свою способность выполнить запрос POST и посмотреть ответ. Поэтому в другом окне терминала я набираю
curl http://localhost:3000/user --verbose --data "<test><m>whatever</m></test>" -H "Content-Type: text/xml"
На данный момент, поскольку я не реализовал никаких методов POST, я ожидаю увидеть ответ «405 Метод не разрешен». Вместо этого я вижу следующее:
* About to connect() to localhost port 3000 (#0)
* Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 3000 (#0)
> POST /user HTTP/1.1
> User-Agent: curl/7.19.6 (i386-apple-darwin10.0.0) libcurl/7.19.6 zlib/1.2.5
> Host: localhost:3000
> Accept: */*
> Content-Type: text/xml
> Content-Length: 28
>
* Empty reply from server
* Connection #0 to host localhost left intact
curl: (52) Empty reply from server
* Closing connection #0
Это затем приводит к сбою тестового сервера катализатора. Сервер ничего не регистрирует, но в будущем пытается связаться с сервером, например, выполнение еще одного запроса GET к «localhost: 3000 / user» приводит к ошибкам «curl to not connect to host» от curl.
Замечу, что это происходит только в том случае, если я использую Catalyst :: Controller :: REST. Если я просто сделаю обычный контроллер, POSTing к нему ничего не вылетит. Поэтому я предполагаю, что это происходит при действии десериализации, которое будет делегировано XML :: Simple (согласно стандартному значению Catalyst :: Controller :: REST). Есть идеи?
Кстати, я хочу создать метод, подобный sub thing :Local :ActionClass('REST') ...
и соответствующий sub thing_POST
. Насколько я понимаю, POST-запросы к / user / вещь, содержащая XML, должны затем автоматически десериализоваться и поместить их в $c->request->data
, прежде чем будет вызван thing_POST
. Приведенные выше тесты являются предварительными к этому - предназначены для проверки того, что происходит, если определен метод no POST. (Что бы это ни стоило, я получаю точно такое же поведение, если я создаю sub thing
и sub thing_POST
, а затем использую curl для выдачи запроса POST в /user/thing.)