考虑以下发送HTTP 201“已创建”响应给客户端的代码:
我不认为使用以下方法是正确的:
String url = "/app/things?id=42"; // example
response.setStatus(HttpServletResponse.SC_CREATED);
response.setContentType("text/plain");
response.setHeader("Location", url);
response.getWriter().print(url);
这告诉客户端一个新的"thing"被创建了,它可以在URL /app/things?id=42
找到。问题是这个URL是相对的。这对于JSP来说非常完美,可能会写成以下方式:
<img src="<c:url value="/things?id=42" />" />
它会产生以下HTML:
<img src="/app/things?id=42" />
这正是我们所期望的网络应用程序。
但是我不认为这是201响应位置标头所需的。HTTP规范说明:
14.30 位置
位置响应头字段用于将接收方重定向到请求完成或标识新资源的位置,而不是Request-URI。对于201(已创建)响应,位置是由请求创建的新资源的位置。对于3xx响应,位置应指示服务器首选的URI以进行自动重定向到该资源。字段值由单个绝对URI组成。
Location = "Location" ":" absoluteURI
一个例子是:
Location: http://www.w3.org/pub/WWW/People.html
我想知道如何将相对 URL 转换为适用于 Servlets 中的 Location 头部的绝对 URL。我不认为使用以下方法是正确的:
request.getServerName() + ":" + request.getServerPort() + url;
这是正确的解决方案。应该有一个标准的方法来产生正确的输出(以便可以应用URL重写等)。我不想创建一个hack。