Передать значение в обработчик ответов Apache Httpclient - PullRequest
0 голосов
/ 25 октября 2018

Привет, я использую Apache http-клиент, и мне было интересно, возможно ли, что у меня есть общий ответ Hande.Я хочу универсальную функцию, но не универсальный класс.Я не хочу создавать новый обработчик ответа на запрос.

Я знаю только возвращаемый объект во время выполнения, поэтому мне нужно сообщить handleResponse (), в какой объект десериализовать ответ json.Я мог бы вернуть строку и впоследствии десериализовать, но это только увеличит производительность.Когда я пытаюсь вернуть читатель потока, поток закрывается к тому времени, когда функция возвращается.Есть ли способ передать параметр в функцию handleResponse ()?

1 Ответ

0 голосов
/ 25 октября 2018

ResponseHandler подпись параметра задана и не может быть изменена.

Но ничто не мешает вам использовать пользовательскую функцию, не так ли?

static class HttpRequestExecutor implements Closeable  {

    private final CloseableHttpClient httpClient;

    public HttpRequestExecutor(final CloseableHttpClient httpClient) {
        this.httpClient = httpClient;
    }

    public <P, T> T execute(final HttpHost target,
                            final HttpRequest request,
                            final HttpContext context,
                            final P parameter,
                            final BiFunction<HttpResponse, P, T> handler) throws IOException  {
        try (final CloseableHttpResponse response = httpClient.execute(target, request, context)) {
            final T result = handler.apply(response, parameter);
            EntityUtils.consume(response.getEntity());
            return result;
        }
    }

    @Override
    public void close() throws IOException {
        httpClient.close();
    }
}

public static void main(String[] args) throws Exception {
    final HttpRequestExecutor executor = new HttpRequestExecutor(HttpClients.createSystem());

    final HttpHost httpHost = new HttpHost("httpbin.org");
    final HttpUriRequest request = RequestBuilder.get("/").build();
    final HttpClientContext context = HttpClientContext.create();

    executor.execute(httpHost, request, context, Void.TYPE, (httpResponse, voidClass) -> null);
}
...