1

我正在使用Ratpackand构建一个 API Groovy。POST API 总是给出:

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

1 回答 1

2

问题不在于 Rx,而在于 Context 的使用。

您应该尝试将响应处理逻辑保留在您的 Handler 中,即不要传递上下文,而是获取您需要的对象并将它们传递给您的服务。

举个例子

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 认为处理程序匹配并且因为处理程序是 forGET它认为它是 405。

无论 HTTP 方法如何,都有可用的链方法绑定,例如all {}path {}。Chain#all 将处理与特定路径匹配的所有路径和方法。Chain#path(String)

希望这可以帮助。

于 2016-06-04T21:39:23.427 回答