-
Notifications
You must be signed in to change notification settings - Fork 9.1k
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
Why don't host and basePath support path templating? #169
Comments
Echo on what maxlinc said above, provide support for parameter in a host will be great as this is a big blocker for us to adapt Swagger in our current projects. |
What happens if an operation has a path parameter which is the exact same name of this proposed global path parameter in basePath? How the tooling can decide which value goes to which parameter? Here is an example: ---
swagger: '2.0'
info:
version: 1.0.0
title: Pets Store
basePath: /{name}/
paths:
/{name}:
get:
parameters:
- name: name
in: path
description: name
type: string
responses:
200:
description: Returns all the pets
|
@mohsen1 You raise an interesting question about a case where the spec is probably ambiguous, but not something that worries me about basePath in particular. The basePath allows you to write DRY swagger, but it can always be written in a more redundant, expanded form without a basePath. And those cases are equally ambiguous. Your example should be the equivalent of: ---
swagger: '2.0'
info:
version: 1.0.0
title: Pets Store
paths:
/{name}/{name}:
get:
parameters:
- name: name
in: path
description: name
type: string
responses:
200:
description: Returns all the pets Here's a more realistic example: paths:
/users/{name}/friends/{name} That's ambiguous. You shouldn't use the same variable name if you're talking about two different variables. This doesn't just confuse Swagger, it would confuse most client and server-side APIs that do parameter expansion or extraction. For example, it would be equally bad as a rails route: get '/users/:name/friends/:name', to: 'friends#get', as: 'friend' And similarly, I don't think scoping makes it less ambiguous: scope 'users/:name' do
get 'friends/:name', to: 'friends#get', as: 'friend'
end So basically: same name => same variable => same value substitution. If you don't want that than you should use distinct names: paths:
/users/{user_name}/friends/{friend_name} |
Voting for this. @mohsen1 & @maxlinc, while it is maybe not good practice to reference the same parameter multiple times in basePath and a path item, it should not matter though, because unlike a server route binding, code using a Swagger definition works the other way round: It substitutes a parameter reference with a value rather than extracts it, and validation should also be trivially possible, at least in theory. It could only be a problem if you had multiple definitions for the same parameter, but this is resolved by using the most specific definition already. |
Plus one for this feature. https://myserver.com/{region}/{lang}/products Now if I don't use the base path then for each end point I have to use /{region}/{lang}/products You got the idea |
+1 It would be great to have templating support for host so that we don't have to have multiple swagger definitions for development, test and production environment which uses different host. Thanks. |
+1 Really a big need (for me). I'm importing my swagger into Postman, and it doesn't interpret the path parameter (that is a part of the Also, I understand that there will have to be work done on the Postman side for detecting that as a parameter path and ensuring that it is twice-wrapped with curly braces, but having it be officially supported in the Swagger spec would be the first step. |
+1 I created the issue in the swagger-ui area but was asked to +1 this one. This functionality would be very useful for us. |
This is a tooling issue in my opinion. If you need to do preprocessing of your Swagger document, why does Swagger care how you do it? This is my first impression on the matter. If my opinion changes after reading the information above, I'll comment again. |
+1 |
2 similar comments
+1 |
+1 |
+1 we could really use hostname parameterization! |
It would nice nice to somehow incorporate the use of "environments" to the spec (dev, int, qa, prod, etc.) and a hostname for each one. Prior to selecting the "Try it out!" button, you can select an environment to invoke the API. The use of Swagger right now just limits to a single host and would be nice to have one place to go to discover API documentation and test against any environment. |
@cabbonizio - well, there is a solution to that. As long as the spec is hosted in each environment, you can drop the host altogether, and the 'hosting' host will be assumed. I think leaking into environment management inside the spec itself is somewhat out of scope. |
Fair enough @webron. Is the concept of hostname parameterization still on the table at least? |
Anything that's labeled as |
good to know...thx for the info @webron. Looks like there's a decent number of votes. |
Another vote here :) |
👍 |
1 similar comment
👍 |
In the meantime, I used a little markdown magic to provide clients of my services a grid letting them know each environment and host. If you drop this into the info.description field in the Swagger 2.0 spec it renders very nicely in Swagger UI and Editor just pushes your operations down a bit. It doesn't help with the test harness but it works for documentation purposes. Make sure you put a pipe character prior to the below.
|
parent issue #574 |
👍 We'd like to provide access to Swagger UI both via a reverse proxy and by directly connecting to the host. |
+1 |
+1 |
3 similar comments
+1 |
+1 |
+1 |
+1 |
The introduction of the Server Object (instead of |
@webron, could you please give the link to it ^ ? |
Can this be used for authorization url as well? |
The Swagger 2 schema says that neither host nor basePath support path templating. We probalby discussed this but I don't remember the exact reason and it seems like a big limitation. It's common to have parameters in either the host or in the basePath. You can at least work around the basePath limitation with excessively long paths, but there is no workaround for parameter in a host. Swagger will force you to hardcode a value.
Real-world examples:
https://{data_center}.servers.api.rackspacecloud.com/v2/{account_id}
https://{your_company}.okta.com/api/v1/apps/{app_id}
https://{subdomain}.zendesk.com/api/v2/organizations.json
https://api.enterprise.apigee.com/v1/organizations/{org_name}/apis
https://api.heroku.com/apps/{app_id}/addons
I think the reason may have been just:
It's also worth noting that neither host nor basePath are required, nor are they required to resolve to the actual API (e.g. you could set your host to
example.com
).I'm hoping to at least get support targeted for the next spec, if not an update to this spec clarifying that host/basePath templating is not required but may be supported by some projects.
The text was updated successfully, but these errors were encountered: