REST 客户端 Content-Type header 抛出 UnsupportedOperationException
REST client Content-Type header throws UnsupportedOperationException
我正在开发一个 REST 客户端来连接到我无权访问的外部服务器。我已经能够使用 Postman 和 SOAPUi 成功地建立通信,现在我正在尝试使用 Java (org.glassfish.jersey.client.ClientResponse),但无济于事,因为每当我包含 "Content-type: application/json" header,我得到一个异常,如果我不包括这个 header,我得到一个 415 错误(不支持的媒体类型),我认为这是要求我包括 Content-Type header.
这是 header 的准备工作:
Client client = ClientBuilder.newClient();
MultivaluedMap<String, Object> headerMap = new MultivaluedHashMap<String, Object> ();
String username="admin";
String password="admin";
String usernameAndPassword = username + ":" + password;
String authorizationHeaderValue = "Basic " + java.util.Base64.getEncoder().encodeToString( usernameAndPassword.getBytes() );
headerMap.put("Authorization", Arrays.asList(new Object [] { authorizationHeaderValue }));
//headerMap.put("Content-Type", Arrays.asList(new Object [] { "application/json" }));
headerMap.put(HttpHeaders.CONTENT_TYPE, Arrays.asList(new Object [] { MediaType.APPLICATION_JSON }));
body 中的部分内容:
JsonObject value = Json.createObjectBuilder()
.add("var1", var1Object)
.add("var2", var2Object)
.add("var3", var3Array)
.add("var4", var4Array)
.build();
post方法调用:
Response response = client
.target("https://example.com")
.request("application/json")
.headers(headerMap)
.post(Entity.text(value.toString()));
我得到的错误是:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.remove(Unknown Source)
at java.util.AbstractList$Itr.remove(Unknown Source)
at java.util.AbstractList.removeRange(Unknown Source)
at java.util.AbstractList.clear(Unknown Source)
at javax.ws.rs.core.AbstractMultivaluedMap.putSingle(AbstractMultivaluedMap.java:97)
at org.glassfish.jersey.message.internal.OutboundMessageContext.setMediaType(OutboundMessageContext.java:708)
at org.glassfish.jersey.client.ClientRequest.type(ClientRequest.java:419)
at org.glassfish.jersey.client.ClientRequest.variant(ClientRequest.java:443)
at org.glassfish.jersey.client.JerseyInvocation$Builder.storeEntity(JerseyInvocation.java:179)
at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:427)
at org.glassfish.jersey.client.JerseyInvocation$Builder.post(JerseyInvocation.java:334)
at main.java.ofbizrestclientdemo.Main.testCreateProduct(Main.java:438)
at main.java.ofbizrestclientdemo.Main.main(Main.java:520)
一段时间以来,我一直在努力寻找这个问题的原因,但无济于事。谁能看出导致此错误的原因?
提前致谢。
改变
.post(Entity.text(value.toString()));
到
.post(Entity.json(value.toString()));
在您的客户电话中。 Entity.text 产生 "text/plain" 内容类型。
文档:https://docs.oracle.com/javaee/7/api/javax/ws/rs/client/Entity.html#text-T-
问题是由headerMap
中的这些值引起的:
headerMap.put("Authorization", Arrays.asList(new Object [] { authorizationHeaderValue }));
headerMap.put(HttpHeaders.CONTENT_TYPE, Arrays.asList(new Object [] { MediaType.APPLICATION_JSON }));
Arrays.asList
returns 一个不可修改的映射,但是 AbstractMultivaluedMap.putSingle
试图清除值列表,这对于列表是不允许的并且抛出 UnsupportedOperationException
。
我建议用正常的 List
初始化 (new ArrayList<>()
) 替换 Arrays.asList
。
我正在开发一个 REST 客户端来连接到我无权访问的外部服务器。我已经能够使用 Postman 和 SOAPUi 成功地建立通信,现在我正在尝试使用 Java (org.glassfish.jersey.client.ClientResponse),但无济于事,因为每当我包含 "Content-type: application/json" header,我得到一个异常,如果我不包括这个 header,我得到一个 415 错误(不支持的媒体类型),我认为这是要求我包括 Content-Type header.
这是 header 的准备工作:
Client client = ClientBuilder.newClient();
MultivaluedMap<String, Object> headerMap = new MultivaluedHashMap<String, Object> ();
String username="admin";
String password="admin";
String usernameAndPassword = username + ":" + password;
String authorizationHeaderValue = "Basic " + java.util.Base64.getEncoder().encodeToString( usernameAndPassword.getBytes() );
headerMap.put("Authorization", Arrays.asList(new Object [] { authorizationHeaderValue }));
//headerMap.put("Content-Type", Arrays.asList(new Object [] { "application/json" }));
headerMap.put(HttpHeaders.CONTENT_TYPE, Arrays.asList(new Object [] { MediaType.APPLICATION_JSON }));
body 中的部分内容:
JsonObject value = Json.createObjectBuilder()
.add("var1", var1Object)
.add("var2", var2Object)
.add("var3", var3Array)
.add("var4", var4Array)
.build();
post方法调用:
Response response = client
.target("https://example.com")
.request("application/json")
.headers(headerMap)
.post(Entity.text(value.toString()));
我得到的错误是:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.remove(Unknown Source)
at java.util.AbstractList$Itr.remove(Unknown Source)
at java.util.AbstractList.removeRange(Unknown Source)
at java.util.AbstractList.clear(Unknown Source)
at javax.ws.rs.core.AbstractMultivaluedMap.putSingle(AbstractMultivaluedMap.java:97)
at org.glassfish.jersey.message.internal.OutboundMessageContext.setMediaType(OutboundMessageContext.java:708)
at org.glassfish.jersey.client.ClientRequest.type(ClientRequest.java:419)
at org.glassfish.jersey.client.ClientRequest.variant(ClientRequest.java:443)
at org.glassfish.jersey.client.JerseyInvocation$Builder.storeEntity(JerseyInvocation.java:179)
at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:427)
at org.glassfish.jersey.client.JerseyInvocation$Builder.post(JerseyInvocation.java:334)
at main.java.ofbizrestclientdemo.Main.testCreateProduct(Main.java:438)
at main.java.ofbizrestclientdemo.Main.main(Main.java:520)
一段时间以来,我一直在努力寻找这个问题的原因,但无济于事。谁能看出导致此错误的原因?
提前致谢。
改变
.post(Entity.text(value.toString()));
到
.post(Entity.json(value.toString()));
在您的客户电话中。 Entity.text 产生 "text/plain" 内容类型。
文档:https://docs.oracle.com/javaee/7/api/javax/ws/rs/client/Entity.html#text-T-
问题是由headerMap
中的这些值引起的:
headerMap.put("Authorization", Arrays.asList(new Object [] { authorizationHeaderValue }));
headerMap.put(HttpHeaders.CONTENT_TYPE, Arrays.asList(new Object [] { MediaType.APPLICATION_JSON }));
Arrays.asList
returns 一个不可修改的映射,但是 AbstractMultivaluedMap.putSingle
试图清除值列表,这对于列表是不允许的并且抛出 UnsupportedOperationException
。
我建议用正常的 List
初始化 (new ArrayList<>()
) 替换 Arrays.asList
。