2017-10-11 13 views
0

내가 다음 코드를 나머지 핸들러를 구현하도록 노력하고있어 호출되지카우보이는 REST 콜백이

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

다음 출력을 얻습니다 :

allowed_methods 
content_types_provided 

get_json()이 호출되지 않습니다! 하지만 GET 방법을 사용할 때 모든 것이 정상적으로 보입니다.

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