2010-10-14 129 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一樣。