簡體   English   中英

從 Quarkus/Java 發送一個簡單的 GET 請求

[英]Send a simple GET request from Quarkus/Java

我想將 DTO 從一個 quarkus 應用程序發送到另一個。 我正在使用 quarkus 作為框架。 我正在尋找類似的東西從 Quarkus/Java 發送一個簡單的 POST 請求
這是針對 POST 我如何使用 GET 在上述帖子的答案中實現 JCompetence 所做的事情。

我對 quarkus 和 REST 很陌生。 我在這兩個項目中的文件是什么?
使用 REST 時,您的代碼流程是什么。

如何從一個應用程序發送 DTO 的一個非常簡單的實現/演示將非常有幫助。 先感謝您。 這對我有很大幫助。

@Abdullah Chaudhry 雖然可以在 GET 請求中發送正文(您的 DTO),但我認為不建議這樣做。 這篇文章 - HTTP GET with request body - 談到了這個 但是,如果您無論如何都想這樣做,那么這個想法與您給出的 POST 示例完全相同。 您只需要從POST更改為GET

但是,如果您談論的是在 GET 響應的主體上返回 DTO,我想是可以的。

下面我舉一個使用 Quarkus 2.11.1.Final版本的例子。

此示例顯示如何發送帶有正文的 GET 以及如何使用另一個正文回答 GET。

您可以在這些 Quarkus 指南上找到幫助:

DTO

這些類將存在於服務器端和客戶端,它們將是本示例中的 DTO:

public class Account {
    public double balance;
}
public class BankClient {
    public int age;
    public String name;
}

服務器端

pom.xml

    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-resteasy-reactive-jackson</artifactId>
    </dependency>
    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-resteasy-reactive</artifactId>
    </dependency>

資源

@Path("/client")
public class ClientResource {
    @Path("/account")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getAccount(BankClient bankClient) {
        var account = new Account();
        account.balance = 123.45;
        return Response.status(200).entity(account).build();
    }
}

客戶端

pom.xml

    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-resteasy-reactive-jackson</artifactId>
    </dependency>
    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-resteasy-reactive</artifactId>
    </dependency>
    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-rest-client-reactive</artifactId>
    </dependency>

應用程序屬性

quarkus.rest-client.client-api.url=http://localhost:8080
quarkus.rest-client.client-api.scope=javax.inject.Singleton

Rest 客戶服務

package org.acme;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;

@Path("/client")
@RegisterRestClient(configKey="client-api")
public interface ClientService {

    @Path("/account")
    @GET
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    Account getByBankClient(BankClient bankClient);

}

測試儀

import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.eclipse.microprofile.rest.client.inject.RestClient;
@Path("/test")
public class ClientResource {

    @Inject
    @RestClient
    ClientService clientService;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response consumeAccount() {

        var bankClient = new BankClient();
        bankClient.age = 30;
        bankClient.name = "John";

        var account = clientService.getByBankClient(bankClient);

        return Response.status(200).entity(account).build();
    }
}

執行測試

  1. 啟動服務器端應用程序

  2. 啟動客戶端應用程序

  3. 執行客戶端的/test ,例如:

$ curl --verbose http://localhost:8090/test

響應應該是:

*   Trying 127.0.0.1:8090...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8090 (#0)
> GET /test HTTP/1.1
> Host: localhost:8090
> User-Agent: curl/7.68.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Type: application/json;charset=UTF-8
< content-length: 18
< 
* Connection #0 to host localhost left intact
{"balance":123.45}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM