Рассмотрим следующий код, отправляющий ответ 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);
Сообщает клиенту, что была создана новая "вещь" и что ее можно найти по адресу 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-адрес в адрес abosolute для заголовка местоположения для сервлетов.
Я НЕ считаю, что использование:
request.getServerName() + ":" + request.getServerPort() + url;
Является правильным решением. Должен быть стандартный метод, который дает правильный вывод (чтобы можно было переписать URL-адрес и т.д.). Я не хочу создавать хак.