Tidak mendapatkan respon dari backend ketika menggunakan Call Mediator

Disaat memanggil backend menggunakan Call Mediator, backend mengeluarkan respon berupa json, akan tetapi ketika mendapatkan respon dengan json-eval atau $body, keluar error :

ERROR {org.wso2.micro.integrator.core.json.JsonStreamBuilder} - Error occurred while processing document for application/json java.lang.reflect.InvocationTargetException

 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

 at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

 at java.base/java.lang.reflect.Method.invoke(Method.java:566)

...

Caused by: org.apache.axis2.AxisFault: #Can not parse stream. MessageID: urn:uuid:29a54657-aef7-4644-b65a-c4cd4628d08e. Error>>> #getNewJsonPayload. Could not save JSON payload. Invalid input stream found. Payload is not a JSON string.

 at org.apache.synapse.commons.json.JsonUtil.getNewJsonPayload(JsonUtil.java:888)

 at org.apache.synapse.commons.json.JsonStreamBuilder.processDocument(JsonStreamBuilder.java:43)

 ... 22 more

Caused by: org.apache.axis2.AxisFault: #getNewJsonPayload. Could not save JSON payload. Invalid input stream found. Payload is not a JSON string.

 at org.apache.synapse.commons.json.JsonUtil.getNewJsonPayload(JsonUtil.java:872)

 ... 23 more

Setelah menganalisa isu lebih lanjut, respon yang diterima MI Server itu harusnya application/json akan tetapi respon yang diterima bukan JSON seperti log berikut :

DEBUG {org.apache.synapse.transport.http.wire} - HTTPS-Sender I/O dispatcher-1 >> "Content-Encoding: br[\r][\n]"

[2023-02-11 10:17:36,201] DEBUG {org.apache.synapse.transport.http.wire} - HTTPS-Sender I/O dispatcher-1 >> "[\r][\n]"

[2023-02-11 10:17:36,201] DEBUG {org.apache.synapse.transport.http.wire} - HTTPS-Sender I/O dispatcher-1 >> "33[\r][\n]"

[2023-02-11 10:17:36,202] DEBUG {org.apache.synapse.transport.http.wire} - HTTPS-Sender I/O dispatcher-1 >> "![0xdc][0x0][0x0] sK[0xfd][0x99][0xc0][0x8c][0x94]jH[0xe][0x89][0xce]M09S[0x92]RL[0xaa][0xea]\[0x1e]+j`[0xf][0xdf]3[0xb0][0xa6]*[0xe4]u[0x8f]L[0xac][0xce][\r][0xa1]=[0x84][0xd1][0xd1][0xff][\r][\n]"

[2023-02-11 10:17:36,213] DEBUG {org.apache.synapse.transport.http.wire} - HTTPS-Sender I/O dispatcher-1 >> "1[\r][\n]"

[2023-02-11 10:17:36,214] DEBUG {org.apache.synapse.transport.http.wire} - HTTPS-Sender I/O dispatcher-1 >> "[0x3][\r][\n]"

[2023-02-11 10:17:36,214] DEBUG {org.apache.synapse.transport.http.wire} - HTTPS-Sender I/O dispatcher-1 >> "0[\r][\n]"

[2023-02-11 10:17:36,214] DEBUG {org.apache.synapse.transport.http.wire} - HTTPS-Sender I/O dispatcher-1 >> "[\r][\n]"

Seperti yang dilihat di log, kita dapat melihat respon di encode dan tidak dikenali sebagai JSON payload. Alasan kena isu ini terjadi karena respon di kompres/encode dan message builder mi mencoba menampilkan respon, akan tetapi berhubung respon di encode akan menampilkan error  "Invalid input stream found." Payload is not a JSON string".  Ini terjadi karena backend sensitif terhadap "Accept-Encoding" di header saat request dan backend mengeluarkan respon yang telah dikompress .

Jadi untuk tidak mengirim “Accept-Encoding" di header ke backend, kita tambahkan property mediator dibawah ini sebelum memanggil backend atau sebelum Call Mediator.

<property name="Accept-Encoding" scope="transport" action="remove"/> 

Dan deploy ulang project, header “Accept-Encoding" ini dikirim default oleh postman, jadi pastikan data-data default ini tidak mempengaruhi output dari backend.


Revision #1
Created 16 March 2023 07:00:29 by Agus Merdeko
Updated 16 March 2023 07:02:52 by Agus Merdeko