Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JAX-RS UriInfo中按顺序检索查询参数_Java_Rest_Uri_Jax Rs_Query Parameters - Fatal编程技术网

Java 在JAX-RS UriInfo中按顺序检索查询参数

Java 在JAX-RS UriInfo中按顺序检索查询参数,java,rest,uri,jax-rs,query-parameters,Java,Rest,Uri,Jax Rs,Query Parameters,在JAX-RS中,我需要在请求中迭代(任意)给定的查询参数。。。但是在URI中,它们的原始顺序是 如果我注入@Context-UriInfo-UriInfo,那么我可以使用UriInfo.getQueryParameters()来获取查询参数的多值映射,按查询参数名称分组。但是如果我关心所有查询参数的原始顺序呢?有没有一种方法可以简单地迭代名称/值对?或者我必须从uriInfo.getRequestUri()手动提取它们吗 如果我一直使用手动提取,是否有一些标准的或维护良好的更新库可以用于此操作

在JAX-RS中,我需要在请求中迭代(任意)给定的查询参数。。。但是在URI中,它们的原始顺序是

如果我注入
@Context-UriInfo-UriInfo
,那么我可以使用
UriInfo.getQueryParameters()
来获取查询参数的
多值映射
,按查询参数名称分组。但是如果我关心所有查询参数的原始顺序呢?有没有一种方法可以简单地迭代名称/值对?或者我必须从
uriInfo.getRequestUri()
手动提取它们吗


如果我一直使用手动提取,是否有一些标准的或维护良好的更新库可以用于此操作?

查询参数在jax rs和其他REST/web框架中转换为无序映射(在jax rs多值映射中)。此外,正在解析参数的库以无序方式返回它们。我认为对于这种特殊情况,您需要实现自己的解析解决方案,这将把参数放到LinkedHashMap。查看现有的自定义解析解决方案

您可以使用以下命令检索查询字符串(请注意,该字符串已被解码):


但是,您可能知道,您的解决方案不应该依赖于查询参数的顺序。

使用apache HttpClient库的自定义解决方案:

public void process(@Context UriInfo uriInfo) {
    String queryString = uriInfo.getRequestUri().getQuery()
    //TODO: extract the charset from Content-Type header, if present
    List<NameValuePair> queryParams = URLEncodedUtils.parse(queryString, "UTF-8")
    for(NameValuePair param : queryParams) {
        //do what you need
    }
}
公共作废流程(@Context-UriInfo-UriInfo){
字符串queryString=uriInfo.getRequestUri().getQuery()
//TODO:从内容类型头中提取字符集(如果存在)
List queryParams=URLEncodedUtils.parse(queryString,“UTF-8”)
for(NameValuePair参数:queryParams){
//做你需要的
}
}

如果您也在使用spring web,您可以解析查询参数,使用该参数保留顺序:

String query = uriInfo.getRequestUri().getQuery();
UriComponents components = UriComponentsBuilder.newInstance().query(query).build();
// Ordered as they appeared in the query string
MultiValueMap<String, String> queryParams = components.getQueryParams();
String query=uriInfo.getRequestUri().getQuery();
UriComponents=UriComponentsBuilder.newInstance().query(query.build();
//按查询字符串中出现的顺序排序
MultiValueMap queryParams=components.getQueryParams();

我知道大多数解决方案不依赖于查询参数的顺序。但是,您能否提供一个引用,以说明解决方案不应依赖于查询参数的顺序?嗯,框架API本身就是引用。Jax rs将返回多值映射,Javaservlet将返回映射,grails将返回GrailsParameterMap。你能依赖其中任何一个元素的顺序吗?大量使用的框架并没有为您提供一种干净的方法,因此我认为您不应该这样做。你能解释一下你的用例吗?框架API是参考。。。他们各自的领域。URI规范告诉我这在一般情况下是否是允许的,我在RFC3986中没有看到任何说明查询参数顺序必须是无关紧要的。事实上,RFC3986似乎暗示查询甚至不需要携带名称-值对。请参阅示例API,其中顺序非常有用(指定多个顺序重要的排序)。我理解您的观点,从某种意义上说,您是对的,RFC没有声明顺序没有保留,因此您可以自由提供实现,关心顺序。然而,我们生活在一个我们不喜欢重新发明轮子的世界里。这就是我们使用API的原因。而且它们也没有提供一种干净的方法(例如,看看jetty源代码,它们使用无序的多重映射,与jersey的com.sun.jersey.core.util.MultivaluedMapImp相同)。想想你的客户,他们需要对你的api进行特殊处理,以保持秩序。增加了复杂性,有什么好处?还有一点需要补充。您没有说明正在使用哪个jax-rsapi实现。订单保留取决于多值Map类的实现,该类由实现框架提供。对于说“您不应该关心订单”的用户,有一个很好的例子可以保留订单:用户提供查询参数的API,例如
/API?foo=1&bar=2
,对它的响应返回一个URL以获取下一页,例如
/api?foo=1&bar=2&page=2
。如果查询参数不是随机排序的,那么就更好了。
String query = uriInfo.getRequestUri().getQuery();
UriComponents components = UriComponentsBuilder.newInstance().query(query).build();
// Ordered as they appeared in the query string
MultiValueMap<String, String> queryParams = components.getQueryParams();