Как HttpClient выполняет обработку по указанным путям?

Я заметил, что org.apache.http.client.HttpClient определяет execute метод, который принимает целевой хост и параметр запроса.

/**
 * Executes a request to the target using the default context.
 *
 * @param target    the target host for the request.
 *                  Implementations may accept <code>null</code>
 *                  if they can still determine a route, for example
 *                  to a default target or by inspecting the request.
 * @param request   the request to execute
 *
 * @return  the response to the request. This is always a final response,
 *          never an intermediate response with an 1xx status code.
 *          Whether redirects or authentication challenges will be returned
 *          or handled automatically depends on the implementation and
 *          configuration of this client.
 * @throws IOException in case of a problem or the connection was aborted
 * @throws ClientProtocolException in case of an http protocol error
 */
HttpResponse execute(HttpHost target, HttpRequest request)
    throws IOException, ClientProtocolException;

Я углубился в DefaultHttpClient а также DefaultRequestDirector исходный код, и стало очевидно, что чем проще execute(HttpRequest request) Метод разделяет запрос на объект HttpHost и объект HttpRequest и перенаправляет вызов более определенному методу (на самом деле, тот, который также принимает HttpContext объект, но на данный момент меня не волнует контекст).

Мой вопрос: поскольку запрос и хост могут принимать URI, как определяется окончательный URI? Что они оба имеют абсолютный URI? Что если они конфликтуют? Что они оба имеют частичные пути?

1 ответ

Решение

HttpHost представляет собой физическую конечную точку. Он содержит только авторитетную часть (схему, хост и порт) URI, Он не содержит пути. Запрос URI представляет ресурс, который потенциально может быть виртуальным. Там не может быть никаких конфликтов. Только если HttpHost явно не дана авторитетная часть запроса URI предполагается, что физическая конечная точка

Например

HttpHost = http://www.google.com:-1
Request URI = http://www.google.ch/stuff 

Приведет к следующей композиции сообщения

TCP

localhost:<random> -> www.google.com:80

HTTP

GET /stuff HTTP/1.1
Host: www.google.ch

Вы можете увидеть это поведение в AbstractHttpClient.determineTarget приватный вспомогательный метод, который, несмотря на радикальное изменение между 4.0 и 4.3.5, извлекает только схему, хост и порт из URI для вариантов execute которые не поставляют HttpHost, Код, в котором цель и запрос скомпонованы обратно в окончательный маршрут, более сложен, но тщательное чтение методов impl HttpRoute, HttpRoutePlanner и HttpRequest четко ссылается на host или же hostTarget исходящий от хоста HTTP, и путь (а также параметры и фрагмент) из локальной части, полученной из HttpRequest.

Другие вопросы по тегам