client.reset 在 CXF Rest 客户端中的用法

Usage of client.reset in CXF Rest client

我正在使用 CXF 3.1.2 开发 Rest web 服务和客户端,我几乎没有澄清如下,

服务:

    import javax.jws.WebService;
    import javax.ws.rs.Consumes;
    import javax.ws.rs.GET;
    import javax.ws.rs.POST;
    import javax.ws.rs.Path;
    import javax.ws.rs.PathParam;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    public class GenServiceImpl  {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    @Consumes(MediaType.TEXT_PLAIN)
    @Path("/agentLogin/{ext}")

    public String agentLogin(@PathParam("ext") Integer ext) {
    return "EventAgentLoggedIn";
    }

    @POST
    @Produces(MediaType.TEXT_PLAIN)
    @Consumes({"application/xml", MediaType.TEXT_PLAIN})
    @Path("/agentLogout")
    public String agentLogout(String ext) {
    return "EventAgentLoggedOut";
    }

    }

客户:

    import javax.ws.rs.core.Response;
    import org.apache.cxf.jaxrs.client.WebClient;
    public class TestClient {
    static final String REST_URI = "http://localhost:8080/RestfulSample/Restful";
    public static void main(String[] args) {
    WebClient client = WebClient.create(REST_URI);

    //Get
    client.path("agentLogin").path(new Integer(1234)).accept(MediaType.TEXT_PLAIN);
    String agentLoginResponse = client.get(String.class);
    System.out.println(agentLoginResponse);
    client.reset();

    //Post
    client.path("agentLogout").accept(MediaType.TEXT_PLAIN);
    Response agentLogoutResponse = client.post("10245");
    System.out.println(agentLogoutResponse.readEntity(String.class));
    client.reset();
    }

澄清:

  1. 在我上面的示例中 - 在服务 class Post 方法(agentLogout)中,如果我替换 @Consumes({"application/xml", MediaType.TEXT_PLAIN})
    我会收到错误消息 和 @Consumes(MediaType.TEXT_PLAIN) 虽然它在 Get 方法(agentLogin)中工作正常,我可以知道为什么会这样吗?

  2. 使用 client.reset(); 是正确的 - 这里我尝试使用单个 WebClient 来访问我的所有方法。

  3. 您能否告诉我我在示例中尝试的最佳做法?如果你能在这里纠正我,我将不胜感激

谢谢,

这里是澄清。

  1. 发帖时将内容类型设置为text/plain。你可以在你的服务器端设置 class @Consumes(MediaType.TEXT_PLAIN)

    client.replaceHeader("Content-Type",MediaType.TEXT_PLAIN);

  2. 是的,你可以使用 rest 方法,这里是 java doc

When reusing the same WebClient instance for multiple invocations, one may want to reset its state with the help of the reset() method, for example, when the Accept header value needs to be changed and the current URI needs to be reset to the baseURI (as an alternative to a back(true) call). The resetQuery() method may be used to reset the query values only. Both options are available for proxies too.

  1. 我更愿意使用代理并更像 OOPS 一样访问 REST。

您可以为上述服务器创建接口class(通常我将 REST 定义为接口,然后实现接口(更像 SOAP 方式)),这可以使用 WADL 的 WADLToJava maven 插件自动生成.

这是上述服务器端其余部分的示例界面 class

public interface GenService {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    @Consumes(MediaType.TEXT_PLAIN)
    @Path("/agentLogin/{ext}")

    public String agentLogin(@PathParam("ext") Integer ext);

    @POST
    @Produces(MediaType.TEXT_PLAIN)
    @Consumes(MediaType.TEXT_PLAIN)
    @Path("/agentLogout")
    public String agentLogout(String ext);

} 

既然你没有使用 spring ,我将创建一个单例 class

public class CxfRestSingleton {

    public static GenService obj;

    public static GenService getInstance() {

        if (obj == null) {
            obj = JAXRSClientFactory.create("http://localhost:8080/RestfulSample/Restful", GenService.class);
        }
        return obj;
    }

}

您可以使用以下代码访问其余内容。

 public static void main( String[] args )
    {
        System.out.println( CxfRestSingleton.getInstance().agentLogin(12345));
    }