在 CXF restful 网络服务中处理动态查询参数
Handling dynamic query parameter in CXF restful webservice
我想在 CXF RESTful 服务中处理动态查询参数。
我担心的是服务端我不知道请求附带的 parameters/key 个名称的数量。你能告诉我我们如何处理这个吗situation/scenario。
例如我的客户端代码如下所示,
Map<String, String> params = new HashMap<>();
params.put("foo", "hello");
params.put("bar", "world");
WebClient webClient = WebClient.create("http://url");
for (Entry<String, String> entry : params.entrySet()) {
webClient.query(entry.getKey(), entry.getValue());
}
Response res = webClient.get();
下面的代码很适合我,
public String getDynamicParamter(@Context UriInfo ui){
System.out.println(ui.getQueryParameters());
MultivaluedMap<String, String> map = ui.getQueryParameters();
Set keys=map.keySet();
Iterator<String > it = keys.iterator();
while(it.hasNext()){
String key= it.next();
System.out.println("Key --->"+key+" Value"+map.get(key).toString());
}
return "";
}
不过,能否请您告诉我以下内容,
- 是否是标准方式?
- 还有,还有其他方法可以实现吗?
CXF 版本:3.1.4
从 UriInfo
获取查询参数
正如您已经猜到的,UriInfo
API 中有一些方法将为您提供查询参数:
getQueryParameters()
: Returns an unmodifiable map containing the names and values of query parameters of the current request. All sequences of escaped octets in parameter names and values are decoded, equivalent to getQueryParameters(true)
.
getQueryParameters(boolean)
: Returns一个不可修改的映射,包含当前请求的查询参数的名称和值。
UriInfo
can be injected in a resource class member using the @Context
注解:
@Path("/foo")
public class SomeResource {
@Context
private UriInfo uriInfo;
@GET
public Response someMethod() {
MultivaluedMap<String, String> queryParams = uriInfo.getQueryParameters();
...
}
}
并且可以在方法参数中注入:
@GET
public Response someMethod(@Context UriInfo uriInfo) {
MultivaluedMap<String, String> queryParams = uriInfo.getQueryParameters();
...
}
要获取未解析的查询字符串,请执行以下操作:
@GET
public Response someMethod(@Context UriInfo uriInfo) {
String query = uriInfo.getRequestUri().getQuery();
...
}
从HttpServletRequest
获取查询参数
你可以通过注入 HttpServletRequest
和 @Context
注释来获得类似的结果,就像上面提到的UriInfo
。以下是一些有用的方法:
getParameterMap()
: Returns 包含请求中发送的参数的名称和值的不可变映射。
getParameterNames()
: Returns an Enumeration
包含请求中包含的参数名称。
getParameterValues(String)
: Returns 包含给定请求参数的所有值的数组。
getParameter(String)
: Returns请求参数的值。仅当您确定参数只有一个值时才应使用。否则,将只返回给定参数名称的第一个值。
getQueryString()
: Returns 请求中包含的查询字符串 URL.
我想在 CXF RESTful 服务中处理动态查询参数。
我担心的是服务端我不知道请求附带的 parameters/key 个名称的数量。你能告诉我我们如何处理这个吗situation/scenario。
例如我的客户端代码如下所示,
Map<String, String> params = new HashMap<>();
params.put("foo", "hello");
params.put("bar", "world");
WebClient webClient = WebClient.create("http://url");
for (Entry<String, String> entry : params.entrySet()) {
webClient.query(entry.getKey(), entry.getValue());
}
Response res = webClient.get();
下面的代码很适合我,
public String getDynamicParamter(@Context UriInfo ui){
System.out.println(ui.getQueryParameters());
MultivaluedMap<String, String> map = ui.getQueryParameters();
Set keys=map.keySet();
Iterator<String > it = keys.iterator();
while(it.hasNext()){
String key= it.next();
System.out.println("Key --->"+key+" Value"+map.get(key).toString());
}
return "";
}
不过,能否请您告诉我以下内容,
- 是否是标准方式?
- 还有,还有其他方法可以实现吗?
CXF 版本:3.1.4
从 UriInfo
获取查询参数
正如您已经猜到的,UriInfo
API 中有一些方法将为您提供查询参数:
getQueryParameters()
: Returns an unmodifiable map containing the names and values of query parameters of the current request. All sequences of escaped octets in parameter names and values are decoded, equivalent togetQueryParameters(true)
.getQueryParameters(boolean)
: Returns一个不可修改的映射,包含当前请求的查询参数的名称和值。
UriInfo
can be injected in a resource class member using the @Context
注解:
@Path("/foo")
public class SomeResource {
@Context
private UriInfo uriInfo;
@GET
public Response someMethod() {
MultivaluedMap<String, String> queryParams = uriInfo.getQueryParameters();
...
}
}
并且可以在方法参数中注入:
@GET
public Response someMethod(@Context UriInfo uriInfo) {
MultivaluedMap<String, String> queryParams = uriInfo.getQueryParameters();
...
}
要获取未解析的查询字符串,请执行以下操作:
@GET
public Response someMethod(@Context UriInfo uriInfo) {
String query = uriInfo.getRequestUri().getQuery();
...
}
从HttpServletRequest
获取查询参数
你可以通过注入 HttpServletRequest
和 @Context
注释来获得类似的结果,就像上面提到的UriInfo
。以下是一些有用的方法:
getParameterMap()
: Returns 包含请求中发送的参数的名称和值的不可变映射。getParameterNames()
: Returns anEnumeration
包含请求中包含的参数名称。getParameterValues(String)
: Returns 包含给定请求参数的所有值的数组。getParameter(String)
: Returns请求参数的值。仅当您确定参数只有一个值时才应使用。否则,将只返回给定参数名称的第一个值。getQueryString()
: Returns 请求中包含的查询字符串 URL.