服务器使用JAX-RS和RESTeasy在单个URL中向客户端发送“ping请求”

问题描述 投票:10回答:2

我想创建一个Web应用程序,它能够在客户端访问某些URL(例如www.example.com/ping/hello)后“ping”客户端,以便获得服务器和客户端之间的往返时间。通过“ping”请求,我的意思是一个简单的请求,带有来自服务器和客户端的时间戳,并发送回时间戳的响应。我希望如果可能的话,使用单个URL完成此活动。

流程是这样的:

  1. 客户端转到URL
  2. 服务器使用其时间戳将响应发送到客户端
  3. 然后,客户端使用新的时间戳向服务器发送另一个响应
  4. 服务器最终以200 OK结束连接

到目前为止,我只能完成第一步和第二步,但不知道如何确保客户端再次访问相同的URL而不返回第一步。

我的服务器代码是这样的:

@GET
@Path("/helloping")
public Response getPingServerClient(@Context HttpServletRequest req) {
    String result = Long.toString(System.currentTimeMillis());

    return Response.status(200).entity(result).build(); 

    //the code to receive the response from client containing timestamp
}

有没有办法做到这一点?

java rest jax-rs resteasy
2个回答
2
投票

有两个客户端到服务器调用。您必须找出区分这两个调用的方法。

我可以为此目的考虑3个选项:

  1. HTTP标头
  2. GET请求中的查询参数
  3. POST请求带有标记以区分两个调用

请求/响应流程将是这样的:

Client -> Server : Request
Server -> Client : Response with timestamp t1 
Client -> Server : Request with timestamp t2 and the above mentioned marker
Server -> Client : Response 200

在这种方法中,您必须在服务器端和客户端编写自定义代码来处理上述逻辑。


2
投票

我不喜欢你提出的建议,因为你基本上迫使客户设置代码以有效地成为服务器本身。这对客户来说不方便。

相反,考虑一种乒乓方法,客户端首先调用服务器的ping端点,该端点返回服务器的时间戳。一旦客户端获得服务器的ping响应,就会指示客户端调用第二个pong方法,该方法接受新的时间戳。

要求客户端调用Web服务方法比强制客户端成为伪服务器更容易,更简单。因此建议。

© www.soinside.com 2019 - 2024. All rights reserved.