Skip to main content

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.