Qual é a maneira correta de definir o cabeçalho Location para uma resposta HTTP 201 em um aplicativo Java Servlet
Considere o seguinte código enviando uma resposta HTTP 201 "Criada" para o cliente:
String url = "/app/things?id=42"; // example
response.setStatus(HttpServletResponse.SC_CREATED);
response.setContentType("text/plain");
response.setHeader("Location", url);
response.getWriter().print(url);
Informa ao cliente que uma nova "coisa" foi criada e que pode ser encontrada na URL/app/things?id=42
. O problema é que esse URL é relativo. Isso seria perfeito para um JSP, que pode ser escrito da seguinte maneira:
<img src="<c:url value="/things?id=42" />" />
O que produziria o seguinte HTML:
<img src="/app/things?id=42" />
Qual é o que queremos para aplicativos da web.
Mas não acredito que seja isso que queremos para um cabeçalho de localização com 201 respostas. A especificação HTTPestados:
14.30 LocalizaçãoO campo Localização do cabeçalho de resposta é usado para redirecionar o destinatário para um local que não seja o URI do Pedido para concluir a solicitação ou identificação de um novo recurso. Para 201 respostas (Criadas), o Local é o do novo recurso criado pela solicitação. Para respostas 3xx, o local DEVE indicar o URI preferido do servidor para redirecionamento automático para o recurso. O valor do campo consiste em um único URI absoluto.
Location = "Location" ":" absoluteURI
Um exemplo é:
Location: http://www.w3.org/pub/WWW/People.html
Minha pergunta é como eu traduzo esse URL relativo para o URL absoluto do cabeçalho Location da maneira correta para servlets.
Eu não acredito que usando:
request.getServerName() + ":" + request.getServerPort() + url;
É a solução correta. Deve haver um método padrão que produza a saída correta (para que a reescrita da URL etc. possa ser aplicada). Eu não quero criar um hack.