-
Notifications
You must be signed in to change notification settings - Fork 432
Clearly separate compatibility rules for input and output schemas. #851
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
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -41,25 +41,66 @@ expected that code changes are necessary. | |||||||||||||||||||||||
| == {SHOULD} prefer compatible extensions | ||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
| API designers should apply the following rules to evolve RESTful APIs for | ||||||||||||||||||||||||
| services in a backward-compatible way: | ||||||||||||||||||||||||
| services in a backward-compatible way. | ||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
| In general: | ||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
| * Add only optional, never mandatory fields. | ||||||||||||||||||||||||
| * Never change the semantic of fields (e.g. changing the semantic from | ||||||||||||||||||||||||
| customer-number to customer-id, as both are different unique customer keys) | ||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||
| * Consider <<251>> in case a URL has to change. | ||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 👍 |
||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||
| For schemas used in input only: | ||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
| * Add only optional, never mandatory fields (and don't make optional | ||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||
| fields mandatory). | ||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||
| * Don't remove fields. | ||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||
| * While removing fields by itself doesn't break compatibility (if the | ||||||||||||||||||||||||
| server would still accept it, possibly ignoring it, if sent by the client), | ||||||||||||||||||||||||
| it then would allow later to add a same-named field with different type | ||||||||||||||||||||||||
| or semantic (which is harder to catch). Therefore, this is also considered | ||||||||||||||||||||||||
| a non-compatible change. | ||||||||||||||||||||||||
|
Comment on lines
+57
to
+61
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||
| * Input fields may have (complex) constraints being validated via server-side | ||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||
| business logic. Never change the validation logic to be more restrictive and | ||||||||||||||||||||||||
| make sure that all constraints are clearly defined in description. | ||||||||||||||||||||||||
| * `enum` ranges can be reduced when used as input parameters, only if the server | ||||||||||||||||||||||||
| is ready to accept and handle old range values too. The range can be reduced | ||||||||||||||||||||||||
| when used as output parameters. | ||||||||||||||||||||||||
| * `enum` ranges cannot be extended when used for output parameters — clients may | ||||||||||||||||||||||||
| not be prepared to handle it. However, enum ranges can be extended when used | ||||||||||||||||||||||||
| for input parameters. | ||||||||||||||||||||||||
| * `enum` ranges can be reduced when used as input, only if the server | ||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||
| is ready to accept and handle old range values too. | ||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||
| * `enum` ranges can be extended when used for input. | ||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||
| For schemas used in output only: | ||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
| * New mandatory fields can be added, or existing optional ones be made mandatory. | ||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||
| * Don't remove a mandatory field, or make it optional (clients might depend | ||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||
| on it being filled). | ||||||||||||||||||||||||
| * Don't remove optional fields either. | ||||||||||||||||||||||||
| * While removing optional fields by itself doesn't break compatibility, | ||||||||||||||||||||||||
| it then would allow later to add a same-named field with different type | ||||||||||||||||||||||||
| or semantic (which is harder to catch). Therefore, this is also considered a non-compatible change. | ||||||||||||||||||||||||
|
Comment on lines
+73
to
+77
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||
| * `enum` ranges can be reduced when used as output. | ||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||
| * `enum` ranges **cannot** be extended when used for output — clients may | ||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||
| not be prepared to handle it. | ||||||||||||||||||||||||
| * You <<112>> that are used for output parameters and likely to | ||||||||||||||||||||||||
| be extended with growing functionality. The API definition should be updated | ||||||||||||||||||||||||
| first before returning new values. | ||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||
| For schemas used in both input and output (which is common and recommended in | ||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||
| many cases), both of these rule sets combine, i.e. you can only do changes which | ||||||||||||||||||||||||
| are allowed in both input and output. | ||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
| * Add only optional, never mandatory fields. | ||||||||||||||||||||||||
| * Don't remove any fields. | ||||||||||||||||||||||||
| * Don't make mandatory fields optional or make optional fields mandatory. | ||||||||||||||||||||||||
| * Input fields may have (complex) constraints being validated via server-side | ||||||||||||||||||||||||
| business logic. Never change the validation logic to be more restrictive and | ||||||||||||||||||||||||
| make sure that all constraints are clearly defined in description. | ||||||||||||||||||||||||
| * `enum` ranges can be reduced only if the server is ready to still accept and | ||||||||||||||||||||||||
| handle old values. They **cannot** be extended. | ||||||||||||||||||||||||
| * You <<112>> that are used for output parameters and likely to | ||||||||||||||||||||||||
| be extended with growing functionality. The API definition should be updated | ||||||||||||||||||||||||
| first before returning new values. | ||||||||||||||||||||||||
|
Comment on lines
+89
to
99
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is is a consequence of the sentence before, and redundant -- should be omitted. |
||||||||||||||||||||||||
| * Consider <<251>> in case a URL has to change. | ||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
| Input/Output here is from the perspective of a service implementing and | ||||||||||||||||||||||||
| owning the API. For the rare case of APIs implemented by other services | ||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||
| (and consumed by the owning service), this turns around. | ||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
| [#109] | ||||||||||||||||||||||||
| == {SHOULD} design APIs conservatively | ||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.