In designing a RESTful Web Service using HATEOAS, what are the pros and cons of showing a link as a complete URL ("http://server:port/application/customers/1234") vs. just the path ("/application/customers/1234")?
相关问题
- Design RESTful service with multiple ids
- Axios OPTIONS instead of POST Request. Express Res
- Plain (non-HTML) error pages in REST api
- Laravel 5.1 MethodNotAllowedHttpException on store
- Can I parameterize labels and properties on CREATE
相关文章
- Got ActiveRecord::AssociationTypeMismatch on model
- Multiple parameters in AngularJS $resource GET
- Global Exception Handling in Jersey & Spring?
- REST search interface and the idempotency of GET
- Getting error detail from WCF REST
- Send a GET request with a body in JavaScript (XMLH
- GuzzleHttp Hangs When Using Localhost
- JAX-RS (Jersey) ExceptionMapper - @Context injecti
Using RayLou's trichotomy my organization has opted for favoring (2). The primary reason is to avoid XSS (Cross-Site Scripting) attacks. The issue is, if an attacker can inject their own URL root into the response coming back from the server, then subsequent user requests (such as an authentication request with username and password) can be forwarded to the attacker's own server*.
Some have brought up the issue of being able to redirect requests to other servers for load balancing, but (while that is not my area of expertise) I would wager that there are better ways to enable load balancing without having to explicitly redirect clients to different hosts.
*please let me know if there any flaws in this line of reasoning. The goal, of course, is not to prevent all attacks, but at least one avenue of attack.
There is a subtle conceptual ambiguity when people say "relative URI".
By RFC3986's definition, a generic URI contains:
The tricky thing is, when scheme and authority are omitted, the "path" part itself can be either an absolute path (starts with
/
) or a "rootless" relative path. Examples:"http://example.com:8042/over/there?name=ferret"
/over/there
here
or./here
or../here
or etc.So, if the question was "whether a server should produce relative path in restful response", the answer is "No" and the detail reason is available here. I think most people (include me) against "relative URI" are actually against "relative path".
And in practice, most server-side MVC framework can easily generate relative URI with absolute path such as
/absolute/path/to/the/controller
, and the question becomes "whether the server implementation should prefix ascheme://hostname:port
in front of the absolute path". Like the OP's question. I am not quite sure about this one.On the one hand, I still think server returning a full uri is recommended. However, the server should never hardcode the
hostname:port
thing inside source code like this (otherwise I would rather fallback to relative uri with absolute path). Solution is server-side always obtaining that prefix from HTTP request's "Host" header. Not sure whether this works for every situations though.On the other hand, it seems not very troublesome for the client to concatenate the
http://example.com:8042
and the absolute path. After all, the client already know that scheme and domain name when it send the request to the server right?All in all, I would say, recommend to use absolute URI, possibly fallback to relative URI with absolute path, never use relative path.
One drawback of using absolute URIs is that the api cannot be proxied.Take it back... not true. You should go for a full URL including the domain.