2017-10-11 16 views
0

と呼ばれていない私は、RESTハンドラを実装しようとし、次のコードを持っている:私はそのようなカールでリクエストを送信しようとすると、その後カウボーイ - RESTコールバックが

-module(example_handler). 
-behaviour(cowboy_handler). 

-export([init/2, 
     allowed_methods/2, 
     content_types_provided/2, 
     get_json/2]). 

init(Req, State) -> 
    {cowboy_rest, Req, State}. 

allowed_methods(Req, State) -> 
    io:format("allowed_methods~n"), 
    {[<<"GET">>, <<"POST">>], Req, State}. 

content_types_provided(Req, State) -> 
    io:format("content_types_provided~n"), 
    {[{{<<"application">>, <<"json">>, []}, get_json}], Req, State}. 

get_json(_Req, _State) -> 
    io:format("get_json~n") 

を:

curl -H "Accept: application/json" -X POST http://localhost:8080/xxx/xx 

私は次の出力を得ます:

allowed_methods 
content_types_provided 

get_json()は呼び出されません!私は、GETメソッドを使用する場合でも、すべてがOKになります。

私は逃した何
curl -H "Accept: application/json" -X GET http://localhost:8080/xxx/xx 
---------------------------------------------------------------------- 
allowed_methods 
content_types_provided 
get_json 

+1

あなたが自分で何かをやって起動し、あなたが何かにはまり込むとき、特にそれについて尋ねる場合、それはいいだろう。 –

+0

@ɐuıɥɔɐɯ私は私の質問を変更しました。 – Hemul

答えて

1

TL; DR

content_types_providedcontent_types_acceptedと同じではありません。 POSTを処理しているので、後で必要になります。 content_types_providedコールバックは、リソースが優先順に提供メディアの種類のリストを返す、私が使用するものですCowboy2.0.0


、。だから、ときあなたが使用して:あなたは基本的には今から、このハンドラはJSONレスポンスをサポートし、カウボーイを言っている

content_types_provided(Req, State) -> 
    {[ 
    {{<<"application">>, <<"json">>, []}, get_json} 
    ], Req, State}. 

を。そのため、GETを実行すると、HTTP 200 (OK)が正常に取得されますが、POSTは機能しません。

一方、content_types_acceptedコールバックでは、受け入れるものはcontent-typesとなります。あなたは確かにあなたがallowed_methodsコールバックで<<"POST">>を追加しましたので、POST要求を送信することが許可されているが、それはあなたがapplication/jsonを受け入れるようにしたいcowboy_restに語っていないので、HTTP 415 (Unsupported Media Type)応答になります。

これはあなたのために働くべきものである。

-module(example_handler). 

-export([init/2]). 

-export([ 
    allowed_methods/2, 
    content_types_accepted/2, 
    content_types_provided/2 
]). 

-export([get_json/2, post_json/2]). 

%%%============================================== 
%%% Exports 
%%%============================================== 
init(Req, Opts) -> 
    {cowboy_rest, Req, Opts}. 

allowed_methods(Req, State) -> 
    lager:debug("allowed_methods"), 
    {[<<"GET">>, <<"POST">>], Req, State}. 

content_types_accepted(Req, State) -> 
    lager:debug("content_types_accepted"), 
    {[ 
    {{<<"application">>, <<"json">>, []}, post_json} 
    ], Req, State}. 

content_types_provided(Req, State) -> 
    lager:debug("content_types_provided"), 
    {[ 
    {{<<"application">>, <<"json">>, []}, get_json} 
    ], Req, State}. 

get_json(Req, State) -> 
    lager:debug("get_json"), 
    {<<"{ \"hello\": \"there\" }">>, Req, State}. 

post_json(Req, State) -> 
    lager:debug("post_json"), 
    {true, Req, State}. 

%%%============================================== 
%%% Internal 
%%%============================================== 
+0

ありがとうございました!これは論理的です、私には恥です...私はErlangには新しいですが、それに情熱的です。 – Hemul

関連する問題