簡體   English   中英

REST客戶端的Content-Type標頭引發UnsupportedOperationException

[英]REST client Content-Type header throws UnsupportedOperationException

我正在開發REST客戶端以連接到我無權訪問的外部服務器。 我已經能夠使用Postman和SOAPUi成功地建立通信,現在我正在嘗試使用Java(org.glassfish.jersey.client.ClientResponse),但無濟於事,因為每當我包含“ Content-type:application / json”標頭,則出現異常,如果不包含此標頭,則會出現415錯誤(不受支持的媒體類型),我認為該錯誤要求我包含Content-Type標頭。

這是標題准備:

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 }));

身體的一部分:

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產生“文本/純文本”內容類型。

Doc: 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返回一個不可修改的映射,但是AbstractMultivaluedMap.putSingle嘗試清除值列表,列表不允許這樣做,並且拋出UnsupportedOperationException

我建議用常規的List初始化( new ArrayList<>() )替換Arrays.asList

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM