2017-02-05 10 views
0

Попытка установки RESTful API с помощью Ковбоя главное, что я nedd использовать один обработчик для всех методовCowboy множественный метод обработчика

здесь маршрутизатор ::

start(_Type, _Args) -> 
    Dispatch = cowboy_router:compile([ 
     {'_', [ 
      {"/api", handler, []}, 
      {"/api/:id", handler, []} 
     ]} 
    ]), 
    {ok, _} = cowboy:start_clear(http, 100, [{port, 8080}], #{ 
     env => #{dispatch => Dispatch} 
    }), 
    api_sup:start_link(). 

и вот код обработчика ::

-module(handler). 
-export([init/3, handle/2]). 

init(_Transport, Req, []) -> 
    {ok, Req, undefined}. 

handle(Req, Opts) -> 
    case cowboy_req:method(Req) of 
    <<"POST">> -> 
     Body = cowboy_req:has_body(Req), 
     Request = postMethod(<<"POST">>, Body, Req), 
     {ok, Request, Opts}; 
    <<"GET">> -> 
     #{id := Id} = cowboy_req:match_qs([{id, [], undefined}], Req), 
     Request = getMethod(<<"GET">>, Id, Req), 
     {ok, Request, Opts}; 
    <<"PUT">> -> 
     Body = cowboy_req:has_body(Req), 
     Request = putMethod(<<"PUT">>, Body, Req), 
     {ok, Request, Opts}; 
    <<"DELETE">> -> 
     #{id := Id} = cowboy_req:match_qs([{id, [], undefined}], Req), 
     Request = deleteMethod(<<"DELETE">>, Id, Req), 
     {ok, Request, Opts} 
    end. 

    postMethod(<<"POST">>, _Body, Req) -> 
    cowboy_req:reply(200, #{<<"content-type">> => <<"application/json; charset=utf-8">>}, <<"{\"status\": \"POST\"}">>, Req). 
    getMethod(<<"GET">>, _Id, Req) -> 
     cowboy_req:reply(200, #{<<"content-type">> => <<"application/json; charset=utf-8">>}, <<"{\"status\": \"GET\"}">>, Req). 
    putMethod(<<"PUT">>, _Body, Req) -> 
     cowboy_req:reply(200, #{<<"content-type">> => <<"application/json; charset=utf-8">>}, <<"{\"status\": \"PUT\"}">>, Req). 
    deleteMethod(<<"DELETE">>, _Id, Req) -> 
     cowboy_req:reply(200, #{<<"content-type">> => <<"application/json; charset=utf-8">>}, <<"{\"status\": \"DELETE\"}">>, Req). 

Я получаю сообщение об ошибке: ковбой 500 ошибка

+0

У вас возникли ошибки в терминале, на котором вы запустили этот сервер? – Dogbert

+0

nope, все нормально, когда я запускаю сервер – Qbeck

+0

Удалено lager из api_app.app и ошибка соединения пропала. Но теперь я столкнулся с 500 ошибкой – Qbeck

ответ

0

Найдено ответ. вот код, который отлично работает (с помощью мастера verison ковбойского)

-module(handler). 

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

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

allowed_methods(Req, State) -> 
    {[<<"GET">>, <<"POST">>, <<"PUT">>, <<"DELETE">>], Req, State}. 

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

content_types_accepted(Req, State) -> 
    {[{<<"application/json">>, router}], Req, State}. 

router(Req, Opts) -> 
    case cowboy_req:method(Req) of 
    <<"POST">> -> 
     {<<"{\"status\": \"POST\"}">>, Req, State}; 
    <<"GET">> -> 
     {<<"{\"status\": \"GET\"}">>, Req, State}; 
    <<"PUT">> -> 
     {<<"{\"status\": \"PUT\"}">>, Req, State}; 
    <<"DELETE">> -> 
     {<<"{\"status\": \"DELETE\"}">>, Req, State} 
    end. 
0

Из-за {Method, Req1} = cowboy_req:method(Req0) является кортежем, как {<<"PUT">>, _}, не двоичная <<"PUT">>

+0

Да, я мог видеть это в Руководстве пользователя, но я не понимаю, почему это '<<"PUT">>' в примере cowboy echo_post ::: [https://github.com/ninenines/cowboy/blob/master /examples/echo_post/src/toppage_handler.erl] – Qbeck

+0

Этот вопрос для команды 99s, используйте кортеж –

+0

thx в любом случае. проверит решение asap – Qbeck

0

Вы также можете добавить логику маршрутизатора в content_types_accepted/2 метода обратного вызова следующим образом:

content_types_accepted(Req, State) -> 
     case cowboy_req:method(Req) of 
     {<<"POST">>, _ } -> 
      Accepted = {[{<<"application/json">>, post_json}], Req, State}; 
     {<<"PUT">>, _ } -> 
      Accepted = {[{<<"application/json">>, put_json}], Req, State} 
     end, 
Accepted. 

Я думаю, что этот путь вы можете иметь отдельные обработчики для разных HTTP-глаголов/методов. Это также дает вам более чистый код :)

 Смежные вопросы

  • Нет связанных вопросов^_^