Зевки и PUT-запросы - PullRequest
       32

Зевки и PUT-запросы

2 голосов
/ 14 октября 2010

Я только начал работать с Yaws, чтобы попытаться создать несколько простых веб-сервисов RESTful, однако натолкнулся на неожиданную проблему: я не могу получить доступ к своим данным, когда делаю запрос PUT. Когда я пытаюсь использовать функцию yaws_api: parse_post, я получаю следующую ошибку:

ERROR: Can't parse post body for 'PUT' requests: URL: ...

Я выписал весь запрос, и все выглядит идентично, поэтому я очень растерялся. Я делаю что-то неправильно? GET и POST работают правильно. Фактически, единственное различие между тем, как я сейчас работаю с POST и PUT, заключается в том, что я показываю для каждого, так как сейчас я просто пишу тестовый код, чтобы показать успех.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 21 июля 2011

Вы должны добавить (или изменить) параметр "dav = true" в файле "yaws.conf" в раздел <server> следующим образом:

<server ...>
        dav = true
</server>
2 голосов
/ 28 марта 2011

Я также нахожу странным, что нет эквивалента parse_post / 1 для HTTP-методов без POST в API Yaws.

В любом случае, я просто использую parse_query / 1 для PUT.При заданном PUT-запросе с param1 = abc, param2 = def:

index(Args) ->
  case yaws_arg:method(Args) of
  'PUT' ->
    Parsed = yaws_api:parse_query(Args),
    io:format("PUT PARAMS=~p", [Parsed]),
    ....
  'POST' ->
    ....

вывод:

PUT PARAMS=[{"param1","abc"}, {"param2","def"}}]

(приведенный выше пример относится к контроллеру Erlyweb.)

1 голос
/ 22 февраля 2013

Данные для PUT находятся в # arg.clidata, как и для POST.Внутренне вызов parse_query и parse_post в конечном итоге использует одну и ту же функцию для разбора GET и POST.

Поэтому обход параметров PUT в теле

Parsed = yaws_api:parse_query( Arg#arg{ querydata = Arg#arg.clidata } ),

Он работает путем копирования clidataполе (данные в теле) к полю querydata и анализирует его как GET.

Это предполагает, что тело кодируется как для POST.

...