Как 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.