2016-06-04 1 views
0

Je construis une API en utilisant Ratpack et Groovy. L'API POST est toujours donner:Post API utilisant Ratpack et Groovy donnant 405 Erreur et méthodes RxJava ne fonctionnant pas

405-Méthode introuvable Erreur

Ceci est un extrait de POST Endpoint Handler. Dans ce code, promiseSingle, then, observe, map, doOnNext, doOnError, etc.

RxJAVA fonctions ne fonctionnent pas. Y a-t-il une raison pour laquelle les méthodes RxJava ne fonctionnent pas?

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) } 
    } 

Répondre

1

Le problème n'est pas tant avec Rx qu'avec l'utilisation du contexte. Vous devez essayer de conserver la logique de gestion des réponses dans votre gestionnaire, c'est-à-dire ne pas contourner le contexte, mais plutôt obtenir les objets dont vous avez besoin et les transmettre à vos services.

À titre d'exemple

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() 
     } 
    } 
    } 
} 

Je pense que vous avez quelque chose comme ceci:

get { 
// get stuff 
} 

post { 
    // post stuff 
} 

La raison pour laquelle cela ne fonctionne pas est que Ratpack ne pas utiliser la table de routage pour le traitement entrant demandes, à la place, il utilise la délégation de chaîne. Le get {} se lie au chemin racine et à la méthode http GET et post {} se lie au chemin racine et à la méthode POST http. Parce que get {} correspond au chemin, Ratpack considère le gestionnaire adapté et étant donné que le gestionnaire est pour GET qu'il considère comme un 405.

Il existe des méthodes de chaîne disponibles qui se lient peu importe la méthode HTTP tels que all {} et path {}. La chaîne # all traitera tous les chemins et les méthodes où Chain#path(String) correspond à un chemin spécifique.

Espérons que cela aide.