Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Merged
merged 1 commit into from
Oct 31, 2015

Conversation

codefromthecrypt
Copy link
Contributor

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
Contributor 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
Contributor 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

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

@nblair
Copy link

nblair commented Oct 31, 2015

I like this approach, 👍

Thanks!

@spencergibb
Copy link
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

Wow, that was quick. Cheers Adrian!

@codefromthecrypt
Copy link
Contributor Author

codefromthecrypt commented Nov 1, 2015 via email

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