2011-09-14 3 views
1

Я использую Apache HttpComponents (core - 4.1.3, httpclient 4.1.1), чтобы сделать http-запросы в клиенте REST, который я написал. Для веб-службы требуется OAuth, который я реализовал с помощью знака. Недавно веб-сервис внес 301 переадресации в конечные точки, которые также требуют oauth. Итак, я внедрил настраиваемую RedirectStrategy, которая строит новый запрос и подписывает его указательным указателем, как обычно. Однако первые две строки (в DefaultRequestDirector) сразу после того, как я верну свой новый запрос, устанавливают все заголовки тем, которые были отправлены в первоначальном запросе, эффективно уничтожая мой новый заголовок авторизации и вызывая отказ всех запросов на перенаправление.Заголовки перезаписываются при перенаправлении с использованием Apache HttpComponents

Кто-нибудь знает об этом? Я считал, что всегда возвращаю false в своем обычном RedirectStrategy и передал это в ResponseHandler, который я привязал к моему запросу, но нет тривиального способа восстановления запроса и отправки его обратно через надлежащего клиента.

Эти линии 1021-1023 в DefaultRequestDirector, где она вызывает к моему обычаю RedirectStrategy, а затем вытирает мои заголовки (Попробую ссылку на источник, в ближайшее время):

HttpUriRequest redirect = redirectStrategy.getRedirect(request, response, context); 
HttpRequest orig = request.getOriginal(); 
redirect.setHeaders(orig.getAllHeaders()); 

ответ

2

Я угадал бит, но если код, на который вы ссылаетесь, является строкой 349 of DefaultRequestDirector, то немного дальше по строке 452 происходит вызов requestExec.preProcess(wrapper, httpProcessor, context).

Можно ли зарегистрировать здесь процессор, который подписывает запрос?

Если нет, то BasicHttpProcessor (вероятно, используемый здесь процессор) позволяет регистрировать перехватчики, которые позволяют вам участвовать в предварительной обработке запроса.

Это может быть другой вариант подписать запрос.

В качестве альтернативы, есть объект HttpContext. Javadoc для этого объекта предполагает, что он может использоваться для хранения контекстных данных для запроса, и ваши данные будут соответствовать этому описанию. Поэтому припаркуйте его и перейдите, когда вам это нужно позже.

+0

Пол, спасибо за ваш ответ. К сожалению, я потратил некоторое время на попытку реализовать RequestInterceptor, и к моменту поступления запроса uri, который указатель использует для подписания запроса, был удален до того, что происходит после домена, в котором он ожидает полностью квалифицированного uri. Я предполагаю, что могу сделать копию перехваченного запроса (с полным uri), а затем скопировать заголовок авторизации на перехваченный запрос. Тем не менее, я беспокоюсь о хите производительности. Плюс, это просто кажется очень взломанным. –

+1

Да, возможно, вам не удастся поместить его в запрос, вам, возможно, придется поместить его в сторону, а затем применить позже. Есть объект HttpContext, разве это не то, для чего он нужен? Кажется, что Javadoc предлагает так: https://svn.apache.org/repos/asf/httpcomponents/httpcore/tags/4.1.3/httpcore/src/main/java/org/apache/http/protocol/HttpContext.java , –

+0

Блестящий! Почему я не подумал об этом? Можете ли вы отредактировать свой ответ и добавить этот комментарий, чтобы я мог отметить его как решенный? Спасибо! –

Смежные вопросы