Java REST客户端内容类型标头引发UnsupportedOperationException
我正在开发一个REST客户机,以连接到我无权访问的外部服务器。我已经能够使用Postman和SOAPUi成功地建立通信,现在我正在尝试使用Java(org.glassfish.jersey.client.ClientResponse),但没有用,因为每当我包含“Content-type:application/json”头时,我都会得到一个异常,如果我不包含这个头,我会得到一个415错误(不支持的媒体类型),我相信这要求我包括内容类型标题 以下是标题准备:Java REST客户端内容类型标头引发UnsupportedOperationException,java,rest,post,jersey,Java,Rest,Post,Jersey,我正在开发一个REST客户机,以连接到我无权访问的外部服务器。我已经能够使用Postman和SOAPUi成功地建立通信,现在我正在尝试使用Java(org.glassfish.jersey.client.ClientResponse),但没有用,因为每当我包含“Content-type:application/json”头时,我都会得到一个异常,如果我不包含这个头,我会得到一个415错误(不支持的媒体类型),我相信这要求我包括内容类型标题 以下是标题准备: Client client = Cli
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 }));
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生成“文本/普通”内容类型
文档:问题是由
标题映射中的这些值引起的:
headerMap.put("Authorization", Arrays.asList(new Object [] { authorizationHeaderValue }));
headerMap.put(HttpHeaders.CONTENT_TYPE, Arrays.asList(new Object [] { MediaType.APPLICATION_JSON }));
Arrays.asList
返回一个不可修改的映射,但AbstractMultivaluedMap.putSingle
尝试清除值列表,这是列表不允许的,并引发一个UnsupportedOperationException
我建议将Arrays.asList
替换为正常的List
初始化(newarraylist()
)。此异常与内容类型无关。确保您使用的HTTP方法正确,请求URL正确。Entity.text(value.toString())做什么?
headerMap.put("Authorization", Arrays.asList(new Object [] { authorizationHeaderValue }));
headerMap.put(HttpHeaders.CONTENT_TYPE, Arrays.asList(new Object [] { MediaType.APPLICATION_JSON }));