0

我正在使用 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. 您能否让我知道我在示例中尝试的最佳实践是什么?如果您能在这里纠正我,我们将不胜感激

谢谢,

4

1 回答 1

0

这是澄清。

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

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

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

当多次调用重用同一个 WebClient 实例时,可能希望借助 reset() 方法重置其状态,例如,当需要更改 Accept 标头值并且需要将当前 URI 重置为 baseURI 时(作为 back(true) 调用的替代方法)。resetQuery() 方法只能用于重置查询值。这两个选项也可用于代理。

  1. 我更喜欢像 OOPS 一样使用代理和访问 REST。

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

这是上述服务器端休息类的示例界面

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 ,我将创建一个单例类

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));
    }
于 2015-11-04T14:41:09.783 回答