【问题标题】:Binding/Passing request parameters from controller to client in Micronaut在 Micronaut 中将请求参数从控制器绑定/传递到客户端
【发布时间】:2020-09-15 15:44:27
【问题描述】:

我正在尝试使用 Micronaut 构建网关应用程序。 在客户端,它连接到 REST API,而在控制器端,另一个应用程序正在发送请求>我能够流式传输请求,但不能流式传输路径变量/参数。 例如,如何将控制器中接收到的路径参数传递给客户端。

@Controller("/bintray") 
public class BintrayController {

    private final BintrayLowLevelClient bintrayLowLevelClient;

    private final BintrayClient bintrayClient;

    public BintrayController(BintrayLowLevelClient bintrayLowLevelClient, 
                             BintrayClient bintrayClient
                              ) {
        this.bintrayLowLevelClient = bintrayLowLevelClient;
        this.bintrayClient = bintrayClient;
    }


    @Get(uri = "/packages/{paramFromRequest}", produces = MediaType.APPLICATION_JSON_STREAM) 
    Flowable<BintrayPackage> packages() { 
        return bintrayClient.fetchPackages();
    }

}
@Client(BintrayConfiguration.BINTRAY_API_URL) 
public interface BintrayClient {

    @Get("/api/${bintray.apiversion}/packages/{paramFromRequest}") 
    Flowable<BintrayPackage> fetchPackages(); 

}

非常感谢您的帮助。

【问题讨论】:

    标签: parameters path binding micronaut


    【解决方案1】:

    您可以使用HttpRequest 动态获取路径和查询参数:

    @Get(uri = "/packages", produces = MediaType.APPLICATION_JSON_STREAM) 
    Flowable<BintrayPackage> packages(HttpRequest<?> request) { 
        return bintrayClient.fetchPackages(request.getParameters());
    }
    

    至于 Http 客户端,我不会使用声明式客户端,而是使用低级客户端,并手动添加查询参数以及您在 http 查询中想要的内容

    【讨论】:

      【解决方案2】:

      我不清楚问题是什么,但这可能会有所帮助。而不是在你的控制器中......

          @Get(uri = "/packages/{paramFromRequest}", produces = MediaType.APPLICATION_JSON_STREAM) 
          Flowable<BintrayPackage> packages() { 
              return bintrayClient.fetchPackages();
          }
      

      你可以这样做...

          @Get(uri = "/packages/{paramFromRequest}", produces = MediaType.APPLICATION_JSON_STREAM) 
          Flowable<BintrayPackage> packages(String paramFromRequest) { 
              return bintrayClient.fetchPackages();
          }
      

      在客户端,而不是这个...

          @Get("/api/${bintray.apiversion}/packages/{paramFromRequest}") 
          Flowable<BintrayPackage> fetchPackages(); 
      

      你可以拥有这个...

          @Get("/api/${bintray.apiversion}/packages/{paramFromRequest}") 
          Flowable<BintrayPackage> fetchPackages(String paramFromRequest); 
      

      【讨论】:

      • 谢谢你,它似乎工作正常。我相信@client fetchPackages() 也应该得到如下参数: bintrayClient.fetchPackages(paramFromRequest);对吗?
      • “我相信@client fetchPackages() 也应该获取参数” - 不,@Client 不会提及请求参数。用@Client 标记的类中的fetchPackages 方法将如代码示例所示。我希望这是有道理的。
      • 好的,谢谢。我可以使用声明式客户端修改响应的正文,还是应该直接使用低杠杆客户端?
      • "我可以使用声明式客户端修改响应的正文,还是应该直接使用低杠杆客户端?" - 这可能取决于您想要对主体进行什么样的修改以及您需要访问什么才能进行修改。过滤器可能是正确的解决方案,但如果不知道您通过修改响应尝试完成什么,就很难说。可以通过修改从端点返回的模型来对主体进行一些修改。
      • “例如,当 json 中返回的属性名称不正确或描述不正确时,我将不得不更正它们。” - 我会在您的模型类上使用相关的 Jackson 注释来做到这一点。这样您就不需要过滤器或任何其他特殊组件。您可以注释现有组件并从中获取所需的 JSON。
      猜你喜欢
      • 2014-06-02
      • 2018-05-04
      • 2020-07-10
      • 1970-01-01
      • 2016-06-17
      • 1970-01-01
      • 2018-07-09
      • 2015-05-19
      • 2019-12-19
      相关资源
      最近更新 更多