我尝试使用一些参数发送POST请求。为此,我形成了MultivaluedMap
如果我将此添加到MultivaluedMap
String ban = subscriber.getBan();
String username = user.getUsername();
postData.add("agent", username);
postData.add("datasource", "online");
postData.add("accountId", ban);
String json = RESTUtil.doPost(url, postData);
一切正常
但如果我这样做
postData.add("agent", user.getUsername());
postData.add("datasource", "online");
postData.add("accountId", subscriber.getBan());
String json = RESTUtil.doPost(url, postData);
我有错误:
com.sun.jersey.api.client.ClientHandlerException:java.lang.ClassCastException:java.lang.String无法强制转换为java.util.List
这是我的帖子方法
public static String doPost(String url, MultivaluedMap formData) {
try {
Client client = Client.create();
WebResource wr = client.resource(url);
client.setConnectTimeout(CONNECTION_TIMEOUT);
client.setReadTimeout(READ_TIMEOUT);
ClientResponse response2 = wr
.accept("application/json;")
.type("application/x-www-form-urlencoded; charset=UTF-8")
.post(ClientResponse.class, formData);
if (response2.getStatus() != 200) {
throw new RuntimeException("Failed : HTTP error code : " + response2.getStatus());
}
return response2.getEntity(String.class);
} catch (Exception e) {
LOG.log(Level.WARNING, "callRestUrl:", e);
JsonObject jo = new JsonObject();
jo.addProperty("resultCode", "EXCEPTION");
jo.addProperty("details", e.getMessage());
return GSON.toJson(jo);
}
}
在第二种情况下,我在.post之后得到错误(ClientResponse.class,formData);
我不明白出了什么问题。 subscriber.getBan()
和user.getUsername()
返回ban
和username
之类的字符串,但如果我使用getter,则会出错。
第2部分。我发现了这篇文章this article
但我不明白何时使用add
或put
及其差异?
答案 0 :(得分:0)
您能否明确说明如何创建MultivaluedMap
的实例?你是怎么用的?
MultivaluedMap是一对键(单值)和值(对象列表)。见声明:
public interface MultivaluedMap<K,V> extends Map<K,List<V>>
我认为您的两个片段在同一段代码中按顺序使用。在第一种情况下,您初始化键'ban'的值(这意味着:值是一个元素的列表),在第二种情况下,您将列表中的值添加到相同的键'ban'。密钥“用户名”的情况完全相同。
我是你的第一种情况,Java自动将列表(一个值)捕获到一个字符串,在第二个add
之后,这不是这种情况。
要验证它,您只需更改顺序(首先执行第二种情况,然后执行第一种情况)。在第二次之后你应该得到同样的错误。
要解决您的问题,请考虑使用方法putSingle
而不是添加,如果您要“更新/替换”该值,或重新启动您的formData
实例(formData = new .. 。)再使用它之前。