Устаревший 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 устарела. Я пробовал гуглить для 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()метод возвращает aCloseableHttpClient, который это -AutoClosable, вы можете поместить объявление в оператор try-with-resources (Java 7+):try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) { // use httpClient (no need to close it explicitly) } catch (IOException e) { // handle }
ИМХО принятый ответ правильный, но пропускает некоторые "учения", поскольку он не объясняет, как придумать ответ. Для всех устаревших классов посмотрите на документация (если у вас нет его либо скачать его или выходить в интернет), он будет подсказывать, какой класс использовать для замены старого кода. Конечно, он не расскажет вам все, но это начало. Пример:
... * * @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) theDefaultHttpClientеще не устарел.
попробовать
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
ex:
MinimalHttpClient httpclient = new HttpClientBuilder().build(); // Prepare a request object HttpGet httpget = new HttpGet("http://www.apache.org/");
Это решение, которое я применил к проблеме, что 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; } }
вы можете добавить следующую зависимость 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);
для исходного вопроса, я бы попросил вас применить ниже логики:
CloseableHttpClient httpClient = HttpClientBuilder.create().build(); HttpPost httpPostRequest = new HttpPost();
Comments