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.