Устаревший 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
устарел. Я пробовал googling для DefaultHttpClient deprecated
и как многие другие варианты, о которых я могу думать, и не могу найти полезных результатов, поэтому я, очевидно, что-то не хватает.
Каков правильный способ Java7 для загрузки содержимого веб-страницы? Действительно ли нет достойного Http-клиента как часть языка? Мне трудно поверить.
Моя зависимость Maven для этого...
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>LATEST</version>
<type>jar</type>
</dependency>
Ответы
Ответ 1
Соответствующие импорта:
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import java.io.IOException;
Использование:
HttpClient httpClient = HttpClientBuilder.create().build();
EDIT (после предложения Жюля):
Когда метод build()
возвращает a CloseableHttpClient
, который есть-a AutoClosable
, вы можете поместить объявление в оператор try-with-resources (Java 7 +):
try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
// use httpClient (no need to close it explicitly)
} catch (IOException e) {
// handle
}
Ответ 2
ИМХО принятый ответ правильный, но пропускает какое-то "учение", поскольку он не объясняет, как ответить на этот вопрос. Для всех устаревших классов посмотрите на 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:
Как отметил Jules в комментариях, возвращаемый класс реализует java.io.Closable
, поэтому, если вы используете Java 7 или выше, вы можете теперь:
try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {...}
Преимущество состоит в том, что вам не нужно иметь дело с finally и null.
Другая соответствующая информация
Также не забудьте прочитать о пуле соединений и установить таймауты.
Ответ 3
Примеры из Apache используют это:
HttpClient httpclient = HttpClients.createDefault();
Класс org.apache.http.impl.client.HttpClients
существует с версии 4.3. Код для HttpClients.createDefault()
совпадает с принятым ответом здесь.
Ответ 4
Он устарел в версии 4.3-alpha1
, которую вы используете из-за спецификации версии LATEST
. Если вы посмотрите на javadoc класса, он скажет вам, что использовать вместо этого: HttpClientBuilder
.
В последней стабильной версии (4.2.3
) DefaultHttpClient
еще не устарели.
Ответ 5
Попробуйте 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
Ответ 6
Я бы предложил использовать метод ниже, если вы пытаетесь читать только данные 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();
Ответ 7
Вы можете добавить следующую зависимость от 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);
Ответ 8
Используйте HttpClientBuilder, чтобы построить HttpClient вместо использования DefaultHttpClient
Пример:
MinimalHttpClient httpclient = new HttpClientBuilder().build();
// Prepare a request object
HttpGet httpget = new HttpGet("http://www.apache.org/");
Ответ 9
Это решение, которое я применил к проблеме, которую HTTP-клиент устарел в этой версии 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;
}
}
Ответ 10
Для исходной проблемы я попрошу вас применить ниже логику:
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
HttpPost httpPostRequest = new HttpPost();