HTTP 303 Oracle ORDS

Sep 10 2020

Мне нужно перенаправить пользователя на другую конечную точку после того, как он сделает POST, но другая конечная точка принимает только запросы GET.

Как сказано в вики, HTTP-код 303 должен сказать клиенту, что нужно отправить запрос в другое место и изменить метод на GET:

Если сервер отвечает на POST или другой неидемпотентный запрос ответом 303 See Other и значением для заголовка местоположения, ожидается, что клиент получит ресурс, упомянутый в заголовке местоположения, с помощью метода GET ( источник ).

Но после ответа клиент снова перенаправляет с помощью POST. Я тестировал конечную точку с помощью Insomnia, и вот вывод временной шкалы:

* Preparing request to http://******:8080/ords/demo/llmob.test_post_david
* Current time is 2020-09-10T07:21:09.418Z
* Using libcurl/7.69.1 OpenSSL/1.1.1e zlib/1.2.11 brotli/1.0.7 libidn2/2.2.0 libssh2/1.9.0 nghttp2/1.29.0
* Using default HTTP version
* Disable timeout
* Enable automatic URL encoding
* Enable SSL validation
* Enable cookie sending with jar of 5 cookies
* Connection 21 seems to be dead!
* Closing connection 21
* Hostname ****** was found in DNS cache
*   Trying 192.168.254.135:8080...
* Connected to ****** (192.168.254.135) port 8080 (#22)

> POST /ords/demo/llmob.test_post_david HTTP/1.1
> Host: ******:8080
> User-Agent: insomnia/2020.3.3
> Access-Control-Allow-Origin: *
> Content-Type: multipart/form-data; boundary=X-INSOMNIA-BOUNDARY
> Accept: */*
> Content-Length: 433

| --X-INSOMNIA-BOUNDARY
| Content-Disposition: form-data; name="ShoppingCartID"
| 78


* We are completely uploaded and fine
* Mark bundle as not supporting multiuse

< HTTP/1.1 303 
< Location: http://******:8080/ords/devapex/sbas/r/self-check-out159/odobreno
< Transfer-Encoding: chunked
< Date: Thu, 10 Sep 2020 07:21:10 GMT


* Ignoring the response-body
* Received 5 B chunk
* Connection #22 to host ****** left intact
* Issue another request to this URL: 'http://******:8080/ords/devapex/sbas/r/self-check-out159/odobreno'
* Disables POST, goes with GET
* Found bundle for host ******: 0x1497368c8870 [serially]
* Can not multiplex, even if we wanted to!
* Re-using existing connection! (#22) with host ******
* Connected to ****** (192.168.254.135) port 8080 (#22)

> POST /ords/devapex/sbas/r/self-check-out159/odobreno HTTP/1.1
> Host: ******:8080
> User-Agent: insomnia/2020.3.3
> Access-Control-Allow-Origin: *
> Content-Type: multipart/form-data; boundary=X-INSOMNIA-BOUNDARY
> Accept: */*
> Content-Length: 433

| --X-INSOMNIA-BOUNDARY
| Content-Disposition: form-data; name="ShoppingCartID"
| 78

* We are completely uploaded and fine
* Mark bundle as not supporting multiuse

< HTTP/1.1 405 
< Allow: GET
< Content-Type: text/html
< Content-Length: 15798
< Date: Thu, 10 Sep 2020 07:21:10 GMT


* Received 7.9 KB chunk
* Received 7.5 KB chunk
* Connection #22 to host ****** left intact

Первый ответ генерируется с помощью следующего OWA_UTILпакета:

 owa_util.status_line(
                         nstatus=> 303, bclose_header=> false
                         );
                         
   owa_util.redirect_url(
             curl         => 'http://******:8080/ords/devapex/sbas/r/self-check-out159/odobreno',
            bclose_header  =>TRUE
            );

ORDS версии 18.4.

Обновлять

Когда тот же запрос выдается из браузера, код ответа - 403 (ошибка ниже), и перенаправление никогда не происходит.

Запрос не может быть обработан, потому что этот ресурс не поддерживает запросы на совместное использование между источниками, или источник запроса не авторизован для доступа к этому ресурсу. Если ords выполняет обратное проксирование, убедитесь, что сервер переднего плана распространяет имя хоста, для mod_proxy убедитесь, что для параметра ProxyPreserveHost установлено значение On

Ответы

EJEgyed Sep 22 2020 at 20:59

Если ваша конечная точка, на которую вы пытаетесь перенаправить пользователя, находится в том же хосте / модуле, вы можете использовать параметр :FORWARD_LOCATIONнеявной привязки, который был введен в ORDS 18.3.

В противном случае вместо использования OWA_UTILдля установки нового местоположения, в которое должен быть перенаправлен пользователь, попробуйте использовать заголовки ответа ORDS. У меня есть пример того , как сделать это здесь .