2010-10-14 124 views
2

我刚开始工作的雅司病,试图创建一些简单的RESTful Web服务,但是我遇到了一个意想不到的问题:我似乎不能当我做了PUT请求访问我的数据。当我尝试使用yaws_api:parse_post功能,我得到以下错误:雅司病和PUT请求

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

我写了整个请求,一切看起来是相同的,所以我很困惑。难道我做错了什么? GETs和POSTs正常工作。事实上,我现在处理POST和PUT的唯一区别就是我现在每个人都显示的内容,现在我只是编写测试代码来显示成功。

在此先感谢。

回答

2

我也觉得奇怪的是有对雅司病API非HTTP POST方法没有parse_post/1的当量。

在任何情况下,我只是使用parse_query/1 PUTs。考虑到与参数1 = ABC,param2的PUT请求= 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控制器)

+0

酷!这看起来像我正在寻找的。谢谢! – blockcipher 2011-03-29 12:30:46

+1

我认为'PUT'没有关联的解析方法是很奇怪的,因为[RFC2616](http://www.w3.org/Protocols/rfc2616/rfc2616.html)将'PUT'定义为完整的资源替换。这意味着请求主体可以拥有比“POST”更广泛的媒体类型,这使得提供这样一个分析器几乎是不可能的。从技术上讲,'POST'主体也可以是多种多样的,但实际上由于使用Web表单,'POST'具有'application/x-www-form-urlencoded'媒体类型的数据的可能性更大。 – 2011-04-18 00:52:19

+0

Steve,我很确定你知道RFC2616比我好,但它看起来像一个PUT主要标识包含请求的实体,因此使它比POST更具体。但是,根据RFC2616,POST和PUT具有相同的媒体类型范围,严格来说,'yaws_api:parse_post()'可能会失败,并引发解析错误(我们需要处理)。那么为什么不有一个'yaws_api:parse_put()'方法工作并且出错有点类似呢?根据我的实际经验,大多数PUT请求都具有application/x-www-form-urlencoded数据,就像POST请求一样。 – ettore 2011-12-28 19:39:14

2

您应该添加(或更改)文件“yaws.conf”中的参数“dav = true”到<server>如下:

<server ...> 
     dav = true 
</server> 
1

Th PUT的e数据位于#arg.clidata中,就像它的POST一样。在内部,对parse_query和parse_post的调用最终使用相同的函数来解析GET和POST。因此

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

一个解决用于在身体PUT参数是它的工作原理由CLIDATA字段(在主体数据)复制到querydata字段和解析它像一个GET。

这假定身体是urlencoded像POST一样。