URL Path Parameter Use Cases

2019-03-24 06:33发布

问题:

Normally when I think of parameters in an URL, I think of the query string. Technically, however, it is also legal to specify parameters in the path segments. Thus given a URL like this:

http://www.a.com/frisbee/brand

It is legal to write this instead:

http://www.a.com/frisbee;color=red;size=small/brand;test=1

In practice I never see this. What frameworks, if any, do make use of this?

I'm working with ASP.NET MVC3 of late, and I'm not sure it can extract these kinds of parameters.

回答1:

Many modern framework will support specifying variables as part of a path segment, in their URL-parsing systems.

Symfony (PHP) and Django (Python) would both support this as they support extracting values from URLs via regular expressions.

One significant difference is that parameters specified in the query string can usually be in any order, because they will typically be parsed into a dictionary-like structure. That wouldn't apply to parameters in a path segment. You could of course parse them yourself into a dictionary, but the frameworks I just mentioned won't help you do that.

Note that technically the order of the parameters is significant in an HTTP URI anyway, i.e. a conforming comparison of two URLs where the parameters (in the path or in the query string) were in a different order would have to assume that they could reference a different resource.



回答2:

Java Servlet Containers uses URL rewriting to maintain session state when the client does not support cookies by appending a path parameter. The servlet specification says the path parameter must be named jsessionid

e.g. http://example.com/servlet_path;jessionid=E60FF3ABD2926AD9AA45513A385E373D

To get this working you must be careful to always pass the URLs you send back to the client through response.encodeURL() or response.encodeRedirectURL() so that the container can add the necessary path parameter.

Further support is demanded by the specification for mapping requests to servlets

The path used for mapping to a servlet is the request URL from the request object minus the context path and the path parameters