Устаревший Java HttpClient - Насколько это сложно?
Все, что я пытаюсь сделать, это загрузить JSON и десериализовать его в объект. Я еще не дошел до загрузки JSON.
Почти каждый пример HttpClient, который я могу найти, в том числе на сайте apache, выглядит примерно так...
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
public void blah() {
HttpClient client = new DefaultHttpClient();
...
}
Тем не менее, Netbeans говорит мне, что DefaultHttpClient
устарела. Я пытался найти в Google DefaultHttpClient deprecated
и столько других вариантов, сколько я могу придумать и не могу найти никаких полезных результатов, поэтому я явно что-то упускаю.
Какой правильный способ загрузки содержимого веб-страницы на Java7? Неужели нет приличного Http-клиента как части языка? Я считаю, что трудно поверить.
Моя зависимость Maven для этого...
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>LATEST</version>
<type>jar</type>
</dependency>
10 ответов
Соответствующий импорт:
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import java.io.IOException;
Использование:
HttpClient httpClient = HttpClientBuilder.create().build();
РЕДАКТИРОВАТЬ (после предложения Жюля):
Как build()
метод возвращает CloseableHttpClient
который является AutoClosable
вы можете поместить объявление в оператор try-with-resources (Java 7+):
try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
// use httpClient (no need to close it explicitly)
} catch (IOException e) {
// handle
}
ИМХО принятый ответ верен, но пропускает некоторое "учение", так как не объясняет, как придумать ответ. Для всех устаревших классов посмотрите на JavaDoc (если у вас его нет, либо загрузите, либо подключитесь к Интернету), он подскажет, какой класс использовать для замены старого кода. Конечно, это не скажет вам всего, но это только начало. Пример:
...
*
* @deprecated (4.3) use {@link HttpClientBuilder}. <----- THE HINT IS HERE !
*/
@ThreadSafe
@Deprecated
public class DefaultHttpClient extends AbstractHttpClient {
Теперь у вас есть класс для использования, HttpClientBuilder
, поскольку нет конструктора для получения экземпляра компоновщика, вы можете догадаться, что вместо него должен быть статический метод: create
, Если у вас есть сборщик, вы также можете догадаться, что, как и для большинства сборщиков, существует метод сборки, таким образом:
org.apache.http.impl.client.HttpClientBuilder.create().build();
AutoClosable:
Как намекал Жюль в комментариях, возвращаемый класс реализует java.io.Closable
, так что если вы используете Java 7 или выше, теперь вы можете сделать:
try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {...}
Преимущество в том, что вам не приходится иметь дело с окончательно и нулевыми значениями.
Другая важная информация
Также не забудьте прочитать о пуле подключений и установить время ожидания.
Примеры от Apache используют это:
HttpClient httpclient = HttpClients.createDefault();
Класс org.apache.http.impl.client.HttpClients
есть начиная с версии 4.3. Код для HttpClients.createDefault()
такой же, как принятый ответ здесь.
Это устарело в версии 4.3-alpha1
который вы используете из-за LATEST
спецификация версии. Если вы посмотрите на javadoc класса, он скажет вам, что вместо этого использовать: HttpClientBuilder
,
В последней стабильной версии (4.2.3
) DefaultHttpClient
пока не рекомендуется.
Пытаться jcabi-http
, который является свободным клиентом Java HTTP, например:
String html = new JdkRequest("https://www.google.com")
.header(HttpHeaders.ACCEPT, MediaType.TEXT_HTML)
.fetch()
.as(HttpResponse.class)
.assertStatus(HttpURLConnection.HTTP_OK)
.body();
Проверьте также этот блог: http://www.yegor256.com/2014/04/11/jcabi-http-intro.html
Я бы предложил использовать метод, описанный ниже, если вы пытаетесь читать только данные json.
URL requestUrl=new URL(url);
URLConnection con = requestUrl.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
StringBuilder sb=new StringBuilder();
int cp;
try {
while((cp=rd.read())!=-1){
sb.append((char)cp);
}
catch(Exception e){
}
String json=sb.toString();
Используйте HttpClientBuilder для создания HttpClient вместо использования DefaultHttpClient
например:
MinimalHttpClient httpclient = new HttpClientBuilder().build();
// Prepare a request object
HttpGet httpget = new HttpGet("http://www.apache.org/");
Вы можете добавить следующую зависимость Maven.
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpmime -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.1</version>
</dependency>
Вы можете использовать следующий импорт в свой код Java.
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGett;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.client.methods.HttpUriRequest;
Вы можете использовать следующий блок кода в вашем коде Java.
HttpClient client = HttpClientBuilder.create().build();
HttpUriRequest httpUriRequest = new HttpGet("http://example.domain/someuri");
HttpResponse response = client.execute(httpUriRequest);
System.out.println("Response:"+response);
Это решение, которое я применил к проблеме, которую httpclient устарел в этой версии Android 22
public static String getContenxtWeb(String urlS) {
String pagina = "", devuelve = "";
URL url;
try {
url = new URL(urlS);
HttpURLConnection conexion = (HttpURLConnection) url
.openConnection();
conexion.setRequestProperty("User-Agent",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)");
if (conexion.getResponseCode() == HttpURLConnection.HTTP_OK) {
BufferedReader reader = new BufferedReader(
new InputStreamReader(conexion.getInputStream()));
String linea = reader.readLine();
while (linea != null) {
pagina += linea;
linea = reader.readLine();
}
reader.close();
devuelve = pagina;
} else {
conexion.disconnect();
return null;
}
conexion.disconnect();
return devuelve;
} catch (Exception ex) {
return devuelve;
}
}
Для исходной проблемы я бы попросил вас применить приведенную ниже логику:
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
HttpPost httpPostRequest = new HttpPost();