2016-06-04 1 views
0

Я создаю API, используя Ratpack и Groovy. POST API всегда дает:Почтовый API с использованием Ratpack и Groovy, дающий 405 ошибок и методы RxJava не работают

405-метод не найдена ошибка

Это фрагмент из POST Endpoint Handler. В этом коде, promiseSingle, then, observe, map, doOnNext, doOnError и т.д.

RxJAVA функция не работает. Есть ли причина, почему методы RxJava не работают?

saveJsonAsData(context, id) 
      .promiseSingle() 
      .then { Data updateddata -> 
       context.response.headers 
        .add(HttpHeaderNames.LOCATION, "/api/save/${updateddata.id}/${updateddata.value}") 
       context.response.status(HttpResponseStatus.CREATED.code()) 
        .send() 
      } 
    } 

    protected Observable<Data> saveJsonAsData(GroovyContext context, String id) { 
     context.request.body.observe() 
      .map { TypedData typedData -> extractData(context, typedData) } 
      .doOnNext { Data data -> 
       data.id = id 
       validatorWrapper.validate(data) 
      } 
      .flatMap(data.&save as Func1) 
      .doOnError { Throwable throwable -> log.error("Error saving data", throwable) } 
    } 

ответ

1

Проблема заключается не столько в Rx, сколько в использовании контекста.

Вы должны попытаться сохранить логику обработки ответов в своем обработчике, то есть не передавать контекст вокруг, а скорее получить нужные вам объекты и передать их вашим услугам.

В качестве примера

path('myendpoint') { MyRxService service -> 
    byMethod { 
    get { 
     // do something when request is GET 
    } 
    post { 
     request.body.map { typedData -> 
     extractItem(typeData) // extract your item from the request first 
     }.flatMap { item -> 
      service.saveJsonAsItemLocation(item).promiseSingle() // then once it's extracted pass the item to your "saveJsonAsItemLocation" method 
     }.then { ItemLocationStore updatedItem -> 
      response.headers.add(HttpHeaderNames.LOCATION, "/itemloc/v1/save/${updatedItem.tcin}/${updatedItem.store}") 
      context.response.status(HttpResponseStatus.CREATED.code()).send() 
     } 
    } 
    } 
} 

Я предполагаю, что у вас есть что-то вроде этого:

get { 
// get stuff 
} 

post { 
    // post stuff 
} 

Причины этого не работает в том, что Ratpack не использует таблицу маршрутизации для обработки входящих запросов, вместо этого он использует делегирование цепей. get {} связывается с корневым путем и методом GET http, а post {} связывается с корневым путем и методом POST http. Поскольку get {} соответствует пути, Ratpack считает обработчик согласованный и так как обработчик для GET он считает это 405.

Существуют методы, доступные цепи, которая связывает независимо от метода HTTP, такие как all {} и path {}. Цепь # все будет обрабатывать все пути и методы, где Chain#path(String) подходит именно вам.

Надеюсь, это поможет.

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

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