【问题标题】:Yaws and PUT requests偏航和 PUT 请求
【发布时间】:2011-04-25 10:01:47
【问题描述】:

我刚开始使用 Yaws 尝试创建一些简单的 RESTful Web 服务,但是我遇到了一个意想不到的问题:当我执行 PUT 请求时,我似乎无法访问我的数据。当我尝试使用 yaws_api:parse_post 函数时,出现以下错误:

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

我写出了整个请求,一切看起来都一样,所以我很困惑。难道我做错了什么? GET 和 POST 可以正常工作。事实上,我现在处理 POST 和 PUT 的方式之间的唯一区别就是我为每个显示的内容,因为现在我只是在编写测​​试代码来显示成功。

提前致谢。

【问题讨论】:

    标签: rest yaws


    【解决方案1】:

    我还觉得很奇怪,Yaws API 中的非 POST HTTP 方法没有等效的 parse_post/1。

    无论如何,我只是将 parse_query/1 用于 PUT。给定一个带有 param1=abc, param2=def 的 PUT 请求:

    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 控制器中。)

    【讨论】:

    • 酷!看起来这正是我想要的。谢谢!
    • 我觉得PUT没有关联的解析方法并不奇怪,因为RFC2616PUT定义为一个完整的资源替换。这意味着请求正文可以具有比POST 更广泛的媒体类型,这使得提供这样的解析器几乎是不可能的。从技术上讲,POST 正文也可以是多种多样的,但在实践中,由于使用 Web 表单,POST 更有可能拥有application/x-www-form-urlencoded 媒体类型的数据。
    • Steve,我很确定你比我更了解 RFC2616,但看起来 PUT 主要标识请求中包含的实体,因此比 POST 更具体。但是,根据 RFC2616,POST 和 PUT 具有相同的媒体类型范围,因此严格来说,yaws_api:parse_post() 可能会失败,抛出解析错误(我们需要处理)。那么,为什么不使用yaws_api:parse_put() 方法,它的工作原理和错误有点相似呢?根据我的实际经验,大部分 PUT 请求都有 application/x-www-form-urlencoded 数据,就像 POST 请求一样。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      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 一样的 urlencoded。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-15
        • 1970-01-01
        • 2012-03-07
        • 2012-07-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多