Skip to content

Adds Feign.Builder.decode404() to reduce boilerplate for empty semantics#290

Merged
codefromthecrypt merged 1 commit into
masterfrom
not-found
Oct 31, 2015
Merged

Adds Feign.Builder.decode404() to reduce boilerplate for empty semantics#290
codefromthecrypt merged 1 commit into
masterfrom
not-found

Conversation

@codefromthecrypt

Copy link
Copy Markdown

This adds the Feign.Builder.decode404() flag which indicates decoders
should process responses with 404 status. It also changes all
first-party decoders (like gson) to return well-known empty values by
default. Further customization is possible by wrapping or creating a
custom decoder.

On why we aren't opening all codes

Prior to this change, we used custom invocation handlers as the way to
add fallback values based on exception or return status. feign-hystrix
uses this to return HystrixCommand<X>, but the general pattern applies
to anything that has a type representing both success and failure, such
as Try<X> or Observable<X>.

As we define it here, 404 status is not a retry or fallback policy, it
is just empty semantics. By limiting Feign's special processing to 404,
we gain a lot with very little supporting code.

If instead we opened all codes, Feign could easily turn bad request,
redirect, or server errors silently to null. This sort of configuration
issue is hard to troubleshoot. 404 -> empty is a very safe policy vs
all codes.

Moreover, we don't create a cliff, where folks seeking fallback policy
eventually realize they can't if only given a response code. Fallback
systems like Hystrix address exceptions that occur before or in lieu of
a response. By special-casing 404, we avoid a slippery slope of half-
implementing Hystrix.

Finally, 404 handling has been commonly requested: it has a clear use-
case, and through that value. This design supports that without breaking
compatibility, or impacting existing integrations such as Hystrix or
Ribbon.

See #238 #287

@codefromthecrypt

Copy link
Copy Markdown
Author

Thanks to @uschi2000 @nblair, who both asked for this and offered ideas about it, also @spencergibb and @jdamick, who were involved in recent brainstorming

@codefromthecrypt

Copy link
Copy Markdown
Author

@FrEaKmAn your work is also related.

This adds the `Feign.Builder.decode404()` flag which indicates decoders
should process responses with 404 status. It also changes all
first-party decoders (like gson) to return well-known empty values by
default. Further customization is possible by wrapping or creating a
custom decoder.

Prior to this change, we used custom invocation handlers as the way to
add fallback values based on exception or return status. `feign-hystrix`
uses this to return `HystrixCommand<X>`, but the general pattern applies
to anything that has a type representing both success and failure, such
as `Try<X>` or `Observable<X>`.

As we define it here, 404 status is not a retry or fallback policy, it
is just empty semantics. By limiting Feign's special processing to 404,
we gain a lot with very little supporting code.

If instead we opened all codes, Feign could easily turn bad request,
redirect, or server errors silently to null. This sort of configuration
issue is hard to troubleshoot. 404 -> empty is a very safe policy vs
all codes.

Moreover, we don't create a cliff, where folks seeking fallback policy
eventually realize they can't if only given a response code. Fallback
systems like Hystrix address exceptions that occur before or in lieu of
a response. By special-casing 404, we avoid a slippery slope of half-
implementing Hystrix.

Finally, 404 handling has been commonly requested: it has a clear use-
case, and through that value. This design supports that without breaking
compatibility, or impacting existing integrations such as Hystrix or
Ribbon.

See #238 #287
@cloudbees-pull-request-builder

Copy link
Copy Markdown

NetflixOSS » feign » feign-pull-requests #173 SUCCESS
This pull request looks good

@nblair

nblair commented Oct 31, 2015

Copy link
Copy Markdown

I like this approach, 👍

Thanks!

@spencergibb

Copy link
Copy Markdown
Contributor

👍

codefromthecrypt pushed a commit that referenced this pull request Oct 31, 2015
Adds Feign.Builder.decode404() to reduce boilerplate for empty semantics
@codefromthecrypt codefromthecrypt merged commit f281065 into master Oct 31, 2015
@codefromthecrypt codefromthecrypt deleted the not-found branch October 31, 2015 19:03
@codefromthecrypt codefromthecrypt added this to the 8.12.0 milestone Oct 31, 2015
@uschi2000

Copy link
Copy Markdown

Wow, that was quick. Cheers Adrian!

@codefromthecrypt

codefromthecrypt commented Nov 1, 2015 via email

Copy link
Copy Markdown
Author

velo pushed a commit that referenced this pull request Oct 8, 2024
Adds Feign.Builder.decode404() to reduce boilerplate for empty semantics
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants