Apache CXF 客户端访问多个资源
Apache CXF client to access multiple resourcess
我的问题可能很愚蠢,但我是 Web 服务领域的新手,我找到了一个教程,但我对此有一些疑问。它正在使用 Apache CXF
。我有包含所有资源的 Calculator
class,将启动服务器的 CalculatorStartUp
,以及我有更多客户端的 Client
class。
下面是代码:
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/calc")
public class Calculator {
@GET
@Path("/add/{a}/{b}")
@Produces(MediaType.TEXT_PLAIN)
public String addPlainText(@PathParam("a") double a, @PathParam("b") double b) {
return (a + b) + "";
}
@GET
@Path("/sub/{a}/{b}")
@Produces(MediaType.TEXT_PLAIN)
public String subPlainText(@PathParam("a") double a, @PathParam("b") double b) {
return (a - b) + "";
}
}
服务器:
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
public class CalculatorStartUp {
public static void main(String[] args) {
JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
sf.setResourceClasses(Calculator.class);
sf.setResourceProvider(Calculator.class,
new SingletonResourceProvider(new Calculator()));
sf.setAddress("http://localhost:9999/calcrest/");
Server server = sf.create();
}
}
客户:
import org.apache.cxf.jaxrs.client.WebClient;
public class Client {
final static String REST_URI = "http://localhost:9999/calcrest";
final static String ADD_PATH = "calc/add";
final static String SUB_PATH = "calc/sub";
final static String MUL_PATH = "calc/mul";
final static String DIV_PATH = "calc/div";
public static void main(String[] args) {
int a = 122;
int b = 34;
String s = "";
WebClient plainAddClient = WebClient.create(REST_URI);
plainAddClient.path(ADD_PATH).path(a + "/" + b).accept("text/plain");
s = plainAddClient.get(String.class);
System.out.println(s);
WebClient plainSubClient = WebClient.create(REST_URI);
plainSubClient.path(SUB_PATH).path(a + "/" + b).accept("text/plain");
s = plainSubClient.get(String.class);
System.out.println(s);
}
我的问题是:
为什么有两个客户端?如果我为 mul
和 div
资源编写一些资源怎么办?我需要添加更多资源吗?为什么要为每个资源编写一个客户端?必须有一种方法可以只创建一个可以访问特定资源的客户端。
我看到在创建 Web 客户端时,您可以传递提供者或提供者列表。谁能解释一下这些提供商代表什么?
如有任何帮助,我将不胜感激!
您的问题:
- 您可以重复使用相同的 WebClient。如果你想重新使用它,你需要调用
WebClient.back(true)
或 WebClient.replacePath(path)
来更新路径并且可以重新使用相同的 baseURI。
- 您可以使用
WebClient.create(String baseAddress, List<?> providers)
,其中第二个参数是提供 JAX-RS 提供程序,例如 JacksonJsonProvider。提供程序用于自定义 JAX-RS 运行时。 WebClient client = WebClient.create(REST_URI,
Collections.singletonList(new JacksonJsonProvider()));
有关 JAX-RS 提供程序的更多信息:What does Provider in JAX-RS mean?
我的问题可能很愚蠢,但我是 Web 服务领域的新手,我找到了一个教程,但我对此有一些疑问。它正在使用 Apache CXF
。我有包含所有资源的 Calculator
class,将启动服务器的 CalculatorStartUp
,以及我有更多客户端的 Client
class。
下面是代码:
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/calc")
public class Calculator {
@GET
@Path("/add/{a}/{b}")
@Produces(MediaType.TEXT_PLAIN)
public String addPlainText(@PathParam("a") double a, @PathParam("b") double b) {
return (a + b) + "";
}
@GET
@Path("/sub/{a}/{b}")
@Produces(MediaType.TEXT_PLAIN)
public String subPlainText(@PathParam("a") double a, @PathParam("b") double b) {
return (a - b) + "";
}
}
服务器:
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
public class CalculatorStartUp {
public static void main(String[] args) {
JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
sf.setResourceClasses(Calculator.class);
sf.setResourceProvider(Calculator.class,
new SingletonResourceProvider(new Calculator()));
sf.setAddress("http://localhost:9999/calcrest/");
Server server = sf.create();
}
}
客户:
import org.apache.cxf.jaxrs.client.WebClient;
public class Client {
final static String REST_URI = "http://localhost:9999/calcrest";
final static String ADD_PATH = "calc/add";
final static String SUB_PATH = "calc/sub";
final static String MUL_PATH = "calc/mul";
final static String DIV_PATH = "calc/div";
public static void main(String[] args) {
int a = 122;
int b = 34;
String s = "";
WebClient plainAddClient = WebClient.create(REST_URI);
plainAddClient.path(ADD_PATH).path(a + "/" + b).accept("text/plain");
s = plainAddClient.get(String.class);
System.out.println(s);
WebClient plainSubClient = WebClient.create(REST_URI);
plainSubClient.path(SUB_PATH).path(a + "/" + b).accept("text/plain");
s = plainSubClient.get(String.class);
System.out.println(s);
}
我的问题是:
为什么有两个客户端?如果我为
mul
和div
资源编写一些资源怎么办?我需要添加更多资源吗?为什么要为每个资源编写一个客户端?必须有一种方法可以只创建一个可以访问特定资源的客户端。我看到在创建 Web 客户端时,您可以传递提供者或提供者列表。谁能解释一下这些提供商代表什么?
如有任何帮助,我将不胜感激!
您的问题:
- 您可以重复使用相同的 WebClient。如果你想重新使用它,你需要调用
WebClient.back(true)
或WebClient.replacePath(path)
来更新路径并且可以重新使用相同的 baseURI。 - 您可以使用
WebClient.create(String baseAddress, List<?> providers)
,其中第二个参数是提供 JAX-RS 提供程序,例如 JacksonJsonProvider。提供程序用于自定义 JAX-RS 运行时。WebClient client = WebClient.create(REST_URI, Collections.singletonList(new JacksonJsonProvider()));
有关 JAX-RS 提供程序的更多信息:What does Provider in JAX-RS mean?