Есть ли в любом случае, чтобы повторить / повторить потребленный запрос POST в Apache httpclient? - PullRequest
0 голосов
/ 06 ноября 2018

Я знаю, что это очень странно, но в моем случае я хочу повторять запрос с дополнительным заголовком (фактически учетными данными) всякий раз, когда первый запрос получил статус 403 ...

Я настраивал HttpClient, как показано ниже, он работает для всех запросов GET, но завершился неудачей для запросов POST с приведенным ниже исключением.

.setServiceUnavailableRetryStrategy(new ServiceUnavailableRetryStrategy() {

                    @Override
                    public boolean retryRequest(HttpResponse response, int executionCount, HttpContext context) {
                        boolean shouldRetry = response.getStatusLine().getStatusCode() == HttpStatus.SC_UNAUTHORIZED
                                && executionCount < 2;
                        if (shouldRetry) {
                            _logger.warn("Got 401 status, retry request with vmware-api-session-id header");
                            context.setAttribute(REQ_ATTR_USING_SESSIONID_HEADER, Boolean.TRUE);
                        } else {
                            context.removeAttribute(REQ_ATTR_USING_SESSIONID_HEADER);
                        }
                        return shouldRetry;
                    }

                    @Override
                    public long getRetryInterval() {
                        return 0;
                    }
                })
                .addInterceptorFirst(new HttpRequestInterceptor() {

                    @Override
                    public void process(HttpRequest request, HttpContext context)
                            throws HttpException, IOException {
                        Boolean withSessionIdHeader = (Boolean) context
                                .getAttribute(REQ_ATTR_USING_SESSIONID_HEADER);
                        if (withSessionIdHeader == null || !withSessionIdHeader) {
                            if (_logger.isDebugEnabled()) {
                                _logger.debug("Removing vmware-api-session-id header");
                            }
                            request.removeHeaders(ServiceProxyController.SESSION_ID_HEADER_NAME);
                        }
                    }
                })

И исключение:

Caused by: org.apache.http.client.NonRepeatableRequestException: Cannot retry request with a non-repeatable request entity
    at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:108)
    at org.apache.http.impl.execchain.ServiceUnavailableRetryExec.execute(ServiceUnavailableRetryExec.java:85)
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
    ... 51 common frames omitted

Я пытался изменить исходный запрос, чтобы пометить его как неиспользованный, но, похоже, он не разрешен ...

Мне интересно, есть ли еще какой-нибудь способ обойти это? Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...