Retrofit: 200 Empty body fails (retrofit:2.0.0)

Created on 22 Sep 2015  Â·  15Comments  Â·  Source: square/retrofit

Hi,

Noticed an issue when receiving a 200 response with an empty body.

Using the jackson-converter.

com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
 at [Source: java.io.InputStreamReader@2fc6f97f; line: 1, column: 1]
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)
    at com.fasterxml.jackson.databind.ObjectReader._initForReading(ObjectReader.java:381)
    at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:1494)
    at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1119)
    at retrofit.JacksonResponseBodyConverter.convert(JacksonResponseBodyConverter.java:33)
    at retrofit.JacksonResponseBodyConverter.convert(JacksonResponseBodyConverter.java:23)
    at retrofit.OkHttpCall.parseResponse(OkHttpCall.java:144)
    at retrofit.OkHttpCall.execute(OkHttpCall.java:112)
    at retrofit.ExecutorCallAdapterFactory$ExecutorCallbackCall.execute(ExecutorCallAdapterFactory.java:60)

However this call works correctly if the response has status code 204 or 205.

Is there any way around this?

Cheers

Most helpful comment

Hi, how to handle an API that return empty response if response is success and return a response "Error":"SessionKeyExpired" when response is failed. Both are successful API call scenario. I try to use Void but that would cause no way to handle the "Error". Thank you.

Sorry for bring up last year's thread.

All 15 comments

Use Void as the response body type. Empty is not valid JSON.

On Tue, Sep 22, 2015, 5:59 AM Jonathon Fry [email protected] wrote:

Hi,

Noticed an issue when receiving a 200 response with an empty body.

com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
at [Source: java.io.InputStreamReader@2fc6f97f; line: 1, column: 1]
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)
at com.fasterxml.jackson.databind.ObjectReader._initForReading(ObjectReader.java:381)
at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:1494)
at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1119)
at retrofit.JacksonResponseBodyConverter.convert(JacksonResponseBodyConverter.java:33)
at retrofit.JacksonResponseBodyConverter.convert(JacksonResponseBodyConverter.java:23)
at retrofit.OkHttpCall.parseResponse(OkHttpCall.java:144)
at retrofit.OkHttpCall.execute(OkHttpCall.java:112)
at retrofit.ExecutorCallAdapterFactory$ExecutorCallbackCall.execute(ExecutorCallAdapterFactory.java:60)

However this call works correctly if the response has status code 204 or
205.

Is there any way around this?

Cheers

—
Reply to this email directly or view it on GitHub
https://github.com/square/retrofit/issues/1105.

Requires the latest snapshot.

On Tue, Sep 22, 2015, 7:58 AM Jake Wharton [email protected] wrote:

Use Void as the response body type. Empty is not valid JSON.

On Tue, Sep 22, 2015, 5:59 AM Jonathon Fry [email protected]
wrote:

Hi,

Noticed an issue when receiving a 200 response with an empty body.

com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
at [Source: java.io.InputStreamReader@2fc6f97f; line: 1, column: 1]
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)
at com.fasterxml.jackson.databind.ObjectReader._initForReading(ObjectReader.java:381)
at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:1494)
at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1119)
at retrofit.JacksonResponseBodyConverter.convert(JacksonResponseBodyConverter.java:33)
at retrofit.JacksonResponseBodyConverter.convert(JacksonResponseBodyConverter.java:23)
at retrofit.OkHttpCall.parseResponse(OkHttpCall.java:144)
at retrofit.OkHttpCall.execute(OkHttpCall.java:112)
at retrofit.ExecutorCallAdapterFactory$ExecutorCallbackCall.execute(ExecutorCallAdapterFactory.java:60)

However this call works correctly if the response has status code 204 or
205.

Is there any way around this?

Cheers

—
Reply to this email directly or view it on GitHub
https://github.com/square/retrofit/issues/1105.

Okay, thanks!

Hi @JakeWharton,

Void did not work for me either. But ResponseBody worked.

One more issue is that when my request returns 404 NOT FOUND, retrofit called onSuccess() of callback. It's the same result when I used Void, ResponseBody and JSONObject in Callback.

Could you please elaborate on how it works so that we will have a single code for all cases empty/success, empty/failure, body/success and body/failure ? Or any link to doc ?

Thanks,
Guru

With retrofit beta2, it works fine with Void for me too.
Pleaseclose this here as I got to understand the stuff now with beta2.

Thanks,
Guru

But how can i create Void instance in retrofit-mock?

@ivashov null will work.

thx, this code crashes with RuntimeException

return Calls.response(null, retrofit);

But this works

return Calls.response(Response.success((Void) null), retrofit);

With what exception?

 E/AndroidRuntime:  Caused by: java.lang.RuntimeException
 E/AndroidRuntime:     at retrofit.mock.BehaviorCall.execute(BehaviorCall.java:152)

The whole trace

On Sat, Oct 24, 2015, 3:21 PM Kirill Ivashov [email protected]
wrote:

E/AndroidRuntime: Caused by: java.lang.RuntimeException
E/AndroidRuntime: at retrofit.mock.BehaviorCall.execute(BehaviorCall.java:152)

—
Reply to this email directly or view it on GitHub
https://github.com/square/retrofit/issues/1105#issuecomment-150842240.

Whole trace

10-25 01:04:26.549 17531-17531/com.github.ivashov.voidretrofit D/MainActivity: deleteCrash() called
10-25 01:04:29.139 17531-17531/com.github.ivashov.voidretrofit D/AndroidRuntime: Shutting down VM
10-25 01:04:29.139 17531-17531/com.github.ivashov.voidretrofit W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x41570d88)
10-25 01:04:29.139 17531-17531/com.github.ivashov.voidretrofit E/test: Exception
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: FATAL EXCEPTION: main
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: Process: com.github.ivashov.voidretrofit, PID: 17531
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: java.lang.IllegalStateException: Could not execute method for android:onClick
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at android.support.v7.internal.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:278)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at android.view.View.performClick(View.java:4584)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at android.view.View$PerformClick.run(View.java:18568)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:733)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:136)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5214)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at java.lang.reflect.Method.invokeNative(Native Method)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:515)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:814)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:630)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at dalvik.system.NativeStart.main(Native Method)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:  Caused by: java.lang.reflect.InvocationTargetException
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at java.lang.reflect.Method.invokeNative(Native Method)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:515)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at android.support.v7.internal.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:273)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at android.view.View.performClick(View.java:4584) 
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at android.view.View$PerformClick.run(View.java:18568) 
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:733) 
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95) 
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:136) 
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5214) 
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at java.lang.reflect.Method.invokeNative(Native Method) 
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:515) 
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:814) 
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:630) 
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at dalvik.system.NativeStart.main(Native Method) 
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:  Caused by: java.lang.RuntimeException
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at retrofit.mock.BehaviorCall.execute(BehaviorCall.java:152)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at com.github.ivashov.voidretrofit.MainActivity.onCrashButton(MainActivity.java:64)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at java.lang.reflect.Method.invokeNative(Native Method) 
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:515) 
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at android.support.v7.internal.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:273) 
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at android.view.View.performClick(View.java:4584) 
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at android.view.View$PerformClick.run(View.java:18568) 
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:733) 
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95) 
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:136) 
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5214) 
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at java.lang.reflect.Method.invokeNative(Native Method) 
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:515) 
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:814) 
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:630) 
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime:     at dalvik.system.NativeStart.main(Native Method)

Whole project
https://github.com/ivashov/retrofit-void-call

It seems that enqueue() doesn't work with retrofit-mock

Thanks. I'll take a look soon.

On Sat, Oct 24, 2015 at 6:08 PM Kirill Ivashov [email protected]
wrote:

Whole trace

10-25 01:04:26.549 17531-17531/com.github.ivashov.voidretrofit D/MainActivity: deleteCrash() called
10-25 01:04:29.139 17531-17531/com.github.ivashov.voidretrofit D/AndroidRuntime: Shutting down VM
10-25 01:04:29.139 17531-17531/com.github.ivashov.voidretrofit W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x41570d88)
10-25 01:04:29.139 17531-17531/com.github.ivashov.voidretrofit E/test: Exception
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: FATAL EXCEPTION: main
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: Process: com.github.ivashov.voidretrofit, PID: 17531
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: java.lang.IllegalStateException: Could not execute method for android:onClick
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at android.support.v7.internal.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:278)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at android.view.View.performClick(View.java:4584)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at android.view.View$PerformClick.run(View.java:18568)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:733)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at android.os.Looper.loop(Looper.java:136)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5214)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:515)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:814)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:630)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: Caused by: java.lang.reflect.InvocationTargetException
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:515)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at android.support.v7.internal.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:273)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at android.view.View.performClick(View.java:4584)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at android.view.View$PerformClick.run(View.java:18568)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:733)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at android.os.Looper.loop(Looper.java:136)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5214)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:515)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:814)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:630)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: Caused by: java.lang.RuntimeException
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at retrofit.mock.BehaviorCall.execute(BehaviorCall.java:152)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at com.github.ivashov.voidretrofit.MainActivity.onCrashButton(MainActivity.java:64)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:515)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at android.support.v7.internal.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:273)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at android.view.View.performClick(View.java:4584)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at android.view.View$PerformClick.run(View.java:18568)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:733)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at android.os.Looper.loop(Looper.java:136)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5214)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:515)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:814)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:630)
10-25 01:04:29.169 17531-17531/com.github.ivashov.voidretrofit E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)

Whole project
https://github.com/ivashov/retrofit-void-call

—
Reply to this email directly or view it on GitHub
https://github.com/square/retrofit/issues/1105#issuecomment-150855718.

Hi, how to handle an API that return empty response if response is success and return a response "Error":"SessionKeyExpired" when response is failed. Both are successful API call scenario. I try to use Void but that would cause no way to handle the "Error". Thank you.

Sorry for bring up last year's thread.

@azlanjamal Did you find a good solution for this scenario?

Was this page helpful?
0 / 5 - 0 ratings