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

AIP-4236 - API Versioning for Version-aware clients #1331

Merged
merged 16 commits into from
May 22, 2024
33 changes: 33 additions & 0 deletions aip/client-libraries/4236.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
---
id: 4236
state: reviewing
created: 2024-05-16
---

# Version-aware clients
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've made a bunch of comments re:guidance appearing in this preamble - perhaps that means the preamble needs to be cut down/generalized/removed/converted into guidance. We don't want to repeat ourselves, we don't want to spread guidance out into various places, and we want to be succinct. Adding a Rationale section go/aip/8#rationale is probably where you want to be explaining the "why"

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for reviewing @noahdietz ! Please let me know if this latest version reads better.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I does! A few more tweaks thanks Tony :)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please could you take another look?


APIs can annotate services with [`google.api.api_version`][]. If
`google.api.api_version` is specified, version-aware clients **must**
include the value of `google.api.api_version` in the request to the API.

### Expected Generator and Client Library Behavior

If a service is annotated with `google.api.api_version`, client library
generators **must** include the version in requests sent to the API via
the HTTP Header `X-Goog-Api-Version`.
noahdietz marked this conversation as resolved.
Show resolved Hide resolved

Requests which contain the API version, **must** include either an HTTP query
parameter `$apiVersion` or HTTP header `X-Goog-Api-Version`, but a request
**must not** contain both.

Generated documentation for a given service **may** include the value of
`google.api.api_version`, if it exists in the source protos.

Copy link

@zhumin8 zhumin8 May 7, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To guide consistent behavior across languages when user attempts to set a user header of the same key, this could be to override an existing version that ships with client library, or attempting to add this header when server does not opt in for this feature.
Let's state something along the lines of:

Suggested change
Generated client library should not let users override the `X-Goog-Api-Version` HTTP header. This should be regardless if the service is annotated with [google.api.api_version].

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd prefer not to add that, personally. There's only so much you can do to protect users who are determined to do weird things. The chances of someone accidentally setting that header are very slim - and if someone really wants to do so, they can always send a request directly from an HTTP client. We definitely shouldn't provide any way of specifically overriding the header - but I don't think "code that allows headers to be specified" should be modified to try to prevent this.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's only so much you can do to protect users who are determined to do weird things.

I agree on this. On the other hand, it also seems valuable to give user usable feedback if we don't intend have this overriden.

To add a bit context in Java, we already have some logic trying to resolve conflict between internal header set by defaults and user headers. I am inclined to add logic to throw exception when user attempt to add a header with key "x-goog-api-version" (draft pr). Alternative to this is no change to this existing logic, which will throw exception only when internal header has this key (that's when service has a api version). I don't feel too strongly, but the first one gives a bit more consistent feedback.

I realize this is only dealing with an edge case, but also feel that this case is language agnostic, so wanted to check if we want to deal with it consistently across languages.

WDTY?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think if Java wants to attempt to stop the user from doing it, that's fine - I don't think it should be in the AIP.

## Rationale

The `google.api.api_version` annotation allows services to abide by the schema and
service behavior at the time the API version was deployed. The format of the
API version **must** be treated as opaque by clients. Generators and clients **must not**
interpret the value of `google.api.api_version` beyond the uses mentioned above.
noahdietz marked this conversation as resolved.
Show resolved Hide resolved

[`google.api.api_version`]: https://github.com/googleapis/googleapis/blob/master/google/api/client.proto
Loading