- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 JAX-RS 构建中继服务器。我需要能够从 GET 请求中提取任何查询参数,然后将它们重新包装到另一个请求中,以传递到另一个服务器。我不熟悉 MultivaluedMap
,但我刚刚弄清楚发生了什么。 UriInfo
类(class)的getQueryParameters
方法返回 MultivaluedMap<String, String>
.令我意外的是,每个参数的值都是 List
值,即使它们声称是 String
值(通过我阅读 JavaDoc 的方式)。
换句话说,如果我有一个键值对 foo=bar
,在 URL 查询字符串中,当我提取参数时,结果为 foo=[bar]
.当我尝试重新包装参数并将其发送到另一台服务器时,这完全让我陷入了循环(实际上是 500 服务器错误)。
是否有另一种方法来处理从请求中解包查询字符串,然后为另一个请求重新打包?我包括一些代码来说明我的问题:
@GET
@Path("parameters")
public Response showParameters(@Context UriInfo uriInfo) {
MultivaluedMap<String, String> parameters = uriInfo.getQueryParameters();
StringBuffer sb = new StringBuffer();
sb.append("<h4>Parameters:</h4>");
if (parameters != null) {
sb.append("<ul>");
Iterator it = parameters.keySet().iterator();
while (it.hasNext()) {
String key = (String)it.next();
sb.append("<li>")
.append(key)
.append(": ")
.append(parameters.get(key))
.append("</li>");
}
sb.append("</ul>");
}
else {
sb.append("<p>None</p>");
}
return Response.ok(sb.toString()).build();
}
所以,总而言之,如果请求有查询参数,从上面的代码打印出来的是这样的:
参数:
有没有另一种解包/重新打包的方法,也许可以完全避免这整个问题?谢谢。
@Jack 为我指明了正确的方向值得称赞,我正在标记 his answer是正确的,但这是我的工作。
Client client = ClientBuilder.newClient();
// Assume instance variable providing URI (without query string).
WebTarget target = client.target(theRequestUri);
// Instance variable uriInfo.
MultivaluedMap<String, String> parameters = uriInfo.getQueryParameters();
if (parameters != null && parameters.size() > 0) {
Iterator it = parameters.keySet().iterator();
String key = null;
StringTokenizer st = null;
while (it.hasNext()) {
key = (String)it.next();
// RESTEasy API is quirky, here. It wraps the values in square
// brackets; moreover, each value is separated by a comma and
// padded by a space as well. ([one, two, three, etc])
st = new StringTokenizer(parameters.get(key).toString(), "[,]");
while (st.hasMoreTokens()) {
target = target.queryParam(key, st.nextToken().trim());
}
}
}
// Instance method: getContentType.
Response response = target.request().accept(getContentType()).get();
最佳答案
这是因为 MultivaluedMap 接口(interface)。
public interface MultivaluedMap<K, V> extends Map<K, List<V>> {
它以 List
的形式返回值。
而不是 parameters.get(key)
试试 parameters.getFirst(key)
请注意,这将删除同一参数的其他值。在进行诸如 blahblah:8080?foo=bar1&foo=bar2
的 rest 调用时,可以为同一参数发送多个值。使用 getFirst()
调用,您将仅获得 bar1
值。如果您确定不会收到多个电话,您可以使用 getFirst(key)
方法
--- 更新 ---根据您的评论,您似乎需要遍历多值映射并在 WebTarget 实例上调用 queryParam。我知道您正在寻找一个图书馆/直接的方式来做到这一点。我没有尝试 RESTEasy。但我认为代码应该足够简单。
multiValuesMap?.each { key, values->
webTargetInstance = webTargetInstance.queryParam(key, values as Object[])
}
关于java - RESTEasy 和方括号中的 MultivaluedMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24833004/
我是否遗漏了什么,或者 Apache 的新 MultiValuedMap 真的没有默认实现吗?可以用来简单地包装提供的 Map> ? 换句话说,我正在寻找现已弃用的 MapUtils.multiVal
我遇到了 MultiValuedMap 声明的问题。当我尝试定义以下内容时,我会收到错误“MultiValuedHashMap 无法解析为类型”。 MultiValuedMap map = new M
我正在使用 commons-collections 中的 MultiValuedMap。我正在尝试在 map 中添加一个带有空列表的条目。 就像你有一个 Map>你会put("string", new
这是我的代码,这是我的第一次尝试。但是正确的方法是什么? private Map prepareParameters(MultivaluedMap queryParameters) {
我正在使用 JAX-RS 构建中继服务器。我需要能够从 GET 请求中提取任何查询参数,然后将它们重新包装到另一个请求中,以传递到另一个服务器。我不熟悉 MultivaluedMap ,但我刚刚弄清楚
我有一个 MultivaluedMap 对象,我想将所有键(不是值)转换为大写。 我设法遍历了该对象,但我不知道如何重新加载它。 有什么想法吗? 最佳答案 为了扩展我对 Ernest 的正确答案的评论
MultivaluedMap map= new MultivaluedMapImpl(); map.add("Accept-Encoding", "compress;q=0.5"); map.add(
我正在尝试使用 Jersey 客户端来模拟对我的 Web 服务的 HTTP 请求。我试图实现 simple example从文档中。这是我的短代码: public void restoreTest(S
我想序列化/反序列化 MultiValuedMap。很难相信,www 中没有示例代码。有谁知道一个例子? 这是我的代码片段 导入 org.apache.commons.collections4.Mul
我正在尝试将 HttpUrl 的查询参数填充到 MultiValuedMap 中。 我已经能够转换为 map 。有没有办法将 Map> 转换为所需的 MultiValuedMap? HttpU
我尝试发送带有一些参数的 POST 请求。为此,我形成了 MultivaluedMap 如果我将其添加到MultivaluedMap String ban = subscriber.getBan();
Java 8 允许迭代 Map使用 forEach和一个 lambda 表达式如下: myMap.forEach((k, v)->{ System.out.println("Key: " + k +
我有一个 MultiValuedMap(Apache commons),其键为字符串,值存储在 double 组列表中,从文件中读取。我不需要对键进行排序,但我确实需要对与每个键关联的 ArrayLi
我有一个 Web 服务,它接受客户端请求并将其发送到第二个 Web 服务。它获取第二个 Web 服务的响应并将其发送到客户端。其实它是一个网关。请求类型是“form urlencoded”。网关接受客
我的键值结构具有重复的键值。因此,我使用 MultiValuedMap。键和值类型都是 double 的。但是,我不确定如何初始化这个结构。 static MultiValuedMap candida
我正在开发一个基于 Jersey 的 Java (1.8) 动态 Web 应用程序,并使用 Maven 定义依赖项。我正在使用 Tomcat 9 在 Eclipse Oxygen 中工作。我在 Web
我正在尝试进行参数化获取(也称为搜索)。我不确定为什么这不起作用。我们使用最新的 jersey 依赖项 (1.14),到目前为止所有 REST 接口(interface)都工作得很好。简单的休息: @
是否可以通过 MultivaluedMap 的注解制作 API 文档?使用 Swagger 在 Jersey 中设置参数? 我有一段这样的代码: /** * Method which serves
这个问题已经有答案了: NoSuchMethodError: MultivaluedMap.addAll in Jersey Client (3 个回答) 已关闭 4 年前。 我正在使用所有最新的 j
提前谢谢您,非常感谢! 我正在尝试使用 apache commons MultiValuedMap 实现。但是,我似乎无法导入正确的包??? 这是我的导入: package com.ge.digita
我是一名优秀的程序员,十分优秀!