有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

客户端的java使用。在CXF Rest客户端中重置

我正在使用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. 在我上面的示例中,在服务类Post方法(agentLogout)中,如果替换@Consumes({"application/xml", MediaType.TEXT_PLAIN})
    ,则会出现错误 具有 @Consumes(MediaType.TEXT_PLAIN)虽然它在Get方法(agentLogin)中工作得很好,但我可以知道为什么会这样吗

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

  3. 你能让我知道我在我的例子中尝试了什么是最佳实践吗?如果您能在这里纠正我的错误,我们将不胜感激

谢谢


共 (1) 个答案

  1. # 1 楼答案

    以下是澄清

    1. 发布时将内容类型设置为文本/普通。您可以在服务器端类中设置@Consumes(MediaType.TEXT_PLAIN)

      客户。replaceHeader(“内容类型”,MediaType.TEXT_-PLAIN)

    2. 是的,您可以使用rest方法,这里是java文档

    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

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

    下面是上述服务器端rest类的示例接口

    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,所以我将创建一个singleton类

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