2016-06-06 2 views
1

Ratpack 및 Groovy를 사용하여 API를 만들었습니다. 데이터를 처리하고 2 개의 cassandra 데이터베이스에 저장해야하는 POST API가 필요하다. 테이블 A와 테이블 B가있다. 지금 내 Ratpack.groovy이 있고, 따라서 나는 데이터가 추진해야 할 때마다 API를 모두 호출 할 수 있습니다 단일 POST API 호출을 사용하여 여러 병렬 작업을 수행하는 방법?

prefix("A") { 
    post { registry.get(PostEndpointA).handle(context) } 
} 
prefix("B") { 
    post { registry.get(PostEndpointB).handle(context) } 
} 

나는이 같은 하나의 POST의 API 호출을 원 하나에 의해 있도록

prefix("post") { 
    post { registry.get(PostEndpointA).handle(context) } 
    post { registry.get(PostEndpointB).handle(context) } 
} 

OR, 난이 원하는 :

prefix("post") { 
     post { registry.get(PostEndpoint).handle(context) } 
} 

그리고 PostEndpoint에서

, 나는 모두 작업을 수행 할 수 있습니다를 API는 요청 함께 두 엔드 포인트에 위임 할 수 있습니다 전화

두 경우 모두 항목은 표 A에만 추가되고 B는 추가되지 않으며 이전에 코드에 쓰여진 것도 있습니다.

참고 ItemA와 ItemB는 본질적으로 동일한 DB와 관련이 있으며 기본 키만 다르므로 두 가지 방법으로 GET을 쉽게 수행 할 수 있습니다. Ratpack에서 어떻게 할 수 있습니까? 나는이 문제를 이해하고있어 경우

+0

일련의 요청/응답 기대로 요구 사항을 제공 할 수 있습니까? 이다 POST/endpointA -> 발생해야 어떤 것을 POST/endpointB - 다른> 뭔가 GET/endpointA -> 뭔가 더 –

+0

POST : endpointA -> 요청 JSON을 구문 분석 및 테이블 A. 에 객체를 저장 endpointB -> JSON 요청 구문 분석 및 객체를 테이블 B에 저장 GET :/api/A/123 -> 식별자가 123 인 테이블 A의 모든 속성을 반환합니다. /api/B/123 -> 모두를 반환합니다. 테이블 A의 속성 식별자 = GET 파트는 괜찮지 만 여러 POST 파트를 처리하는 데 문제가 있습니다. –

+0

아무도 도와 줄 수 있습니까? –

답변

1

제대로이 비슷한 일을 시도 할 수 :

@Grab('io.ratpack:ratpack-groovy:1.3.3') 

import static ratpack.groovy.Groovy.ratpack 

import ratpack.http.Status 
import ratpack.exec.Promise 
import com.google.common.reflect.TypeToken 

class ServiceA { 
    Promise<String> save(json) { 
    Promise.value(json) 
    } 
} 

class ServiceB { 
    Promise<String> save(json) { 
    Promise.value(json) 
    } 
} 

ratpack { 
    bindings { 
    bindInstance new ServiceA() 
    bindInstance new ServiceB() 
    } 
    handlers { 
    post(':name') { // parameterize on path token 
     def name = pathTokens.get('name') // extract token 
     def service = null 
     switch(name) { 
     case 'A': 
      service = get(ServiceA) // extract appropriate service 
      break 
     case 'B': 
      service = get(ServiceB) // extract appropriate service 
      break 
     } 

     parse(new TypeToken<Map<String, Object>>(){}) 
     .flatMap(service.&save) // save your extracted item 
     .then { 
      response.headers.add('Location', "/item/api/$name") 
      response.status(Status.of(201)) 
      response.send() 
     } 
    } 
    } 
} 

샘플 곱슬 당신은 내가 추천 게시 된 질문의 볼륨에서이

$ curl -X POST -H'Content-Type: application/json' -d '{"foo":"bar"}' -v localh ost:5050/A 

< HTTP/1.1 201 Created 
< Location: /item/api/A 
< content-length: 0 
< connection: keep-alive 

$ curl -X POST -H'Content-Type: application/json' -d '{"foo":"bar"}' -v localh ost:5050/B 

< HTTP/1.1 201 Created 
< Location: /item/api/B 
< content-length: 0 
< connection: keep-alive 

처럼 Ratpack 커뮤니티에 여유가없는 채널에 가입 https://slack-signup.ratpack.io/

+0

나는 Ratpack Community Slack Channel에 가입했습니다. 많은 시간과 노력을 감당할 수있는 솔루션이 정말 도움이되어 나중에 사용할 수 있습니다. 하지만 지금은 내 문제가 아니 었습니다. 항상 2 개의 다른 테이블에 POST하고 싶습니다. 조건에 의존하지 않습니다. POST API 호출이있을 때마다 데이터가 테이블 A와 B 모두에 쓰여 져야 함을 의미합니다. 지금은 두 테이블 모두에 데이터를 쓰지 않지만 테이블 A에 삽입하는 코드/처리기가 이전에 작성된 경우에만 A 로의 삽입이 일어나지 않고 B가 아닙니다. –

+0

rxJava/rxGroovy의 Observable.zip()을 살펴 보겠습니다. 이것은 넷플 릭스가 사용하는 것입니다. –

0

우리는 이것을하기 위해 rxJava를 사용합니다 : Single .zip( service.add(cv1), service.add(cv2), (a, b) -> new Object[] { a, b } ) .blockingGet(); 약속을 지키고 배열을 then 블록으로 처리합니다.

관련 문제