У меня на локальном хосте запущено загрузочное приложение Spring со следующим контроллером:
@RestController
public class EtagController {
@GetMapping("/eTag")
public ResponseEntity<String> onGet() {
HttpHeaders headers = new HttpHeaders();
headers.set("ETag", UUID.randomUUID().toString());
return new ResponseEntity<>("", headers, HttpStatus.OK);
}
@PostMapping("/eTag")
public ResponseEntity<String> onPost() {
HttpHeaders headers = new HttpHeaders();
headers.set("ETag", UUID.randomUUID().toString());
return new ResponseEntity<>("", headers, HttpStatus.OK);
}
}
И в браузере работает следующий html / javascript:
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>
<script>
function onGet() {
var xhr = new XMLHttpRequest()
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log('Success');
}
}
xhr.onerror = function() {
console.log('Failure');
}
xhr.open('Get', 'http://127.0.0.1:8080/eTag', true)
xhr.send()
}
function onPost() {
var xhr = new XMLHttpRequest()
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log('Success');
}
}
xhr.onerror = function() {
console.log('Failure');
}
xhr.open('Post', 'http://127.0.0.1:8080/eTag', true)
xhr.send()
}
</script>
<button id="get" onclick="onGet()">Do Get</button>
<button id="post" onclick="onPost()">Do Post</button>
</body>
</html>
Когда я делаюGet
запросов, следующих за первоначальным запросом, заголовок If-None-Match
включен, но он не включается, когда я выполняю Post
запросов даже после первого запроса.Насколько я могу судить, в spec нет ничего, что предполагало бы, что ETags
и If-None-Match
являются исключительными для Get
.Нужно ли самому добавлять заголовок или есть какой-то способ применить это в запросе Post
?Если так, как я могу получить доступ к кэшированному Etag?