httpget - org apache http client methods httppost example java
Java HttpClient descontinuado-Quão difícil pode ser? (7)
Ele foi reprovado na versão 4.3-alpha1
que você usa devido à especificação de versão LATEST. Se você der uma olhada no javadoc da classe, ele lhe dirá o que usar: HttpClientBuilder
.
Na última versão estável ( 4.2.3
), o DefaultHttpClient
ainda não está obsoleto.
Tudo o que estou tentando fazer é baixar alguns JSON e desserializá-lo em um objeto. Ainda não baixei o JSON.
Quase todos os exemplos de HttpClient que eu posso encontrar, incluindo aqueles no site do apache, parecem algo como ...
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
public void blah() {
HttpClient client = new DefaultHttpClient();
...
}
No entanto, o NetBeans me diz que DefaultHttpClient
está obsoleto. Eu tentei googling para DefaultHttpClient deprecated
e como muitas outras variações que posso pensar e não consigo encontrar nenhum resultado útil, então eu obviamente estou faltando alguma coisa.
Qual é o caminho correto do Java7 para baixar o conteúdo de uma página da Web? Existe realmente nenhum cliente Http decente como parte da linguagem? Acho isso difícil de acreditar.
Minha dependência Maven para isso é ...
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>LATEST</version>
<type>jar</type>
</dependency>
Esta é a solução que eu apliquei ao problema que o httpclient preteriu nesta versão do 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;
}
}
IMHO a resposta aceita está correta, mas perde um pouco de "ensino", pois não explica como chegar à resposta. Para todas as classes reprovadas, observe o JavaDoc (se você não o fizer, faça o download ou JavaDoc ), ele indicará qual classe usar para substituir o código antigo. Claro que não vai te contar tudo, mas isso é um começo. Exemplo:
...
*
* @deprecated (4.3) use {@link HttpClientBuilder}. <----- THE HINT IS HERE !
*/
@ThreadSafe
@Deprecated
public class DefaultHttpClient extends AbstractHttpClient {
Agora você tem a classe para usar, HttpClientBuilder
, como não há nenhum construtor para obter uma instância do construtor, você pode imaginar que deve haver um método estático: create
. Depois de ter o construtor, também é possível adivinhar que, para a maioria dos construtores, existe um método de construção , portanto:
org.apache.http.impl.client.HttpClientBuilder.create().build();
AutoClosable:
Como Jules sugeriu nos comentários, a classe retornada implementa java.io.Closable
, portanto, se você usar o Java 7 ou superior, poderá fazer agora:
try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {...}
A vantagem é que você não tem que lidar com finalmente e nulos.
Outras informações relevantes
Certifique-se também de ler sobre o pool de conexões e definir os timeouts .
Importações relevantes:
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import java.io.IOException;
Uso:
HttpClient httpClient = HttpClientBuilder.create().build();
EDIT (após a sugestão de Jules):
Como o método build()
retorna um CloseableHttpClient
que é um AutoClosable
, você pode colocar a declaração em uma instrução try-with-resources (Java 7+):
try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
// use httpClient (no need to close it explicitly)
} catch (IOException e) {
// handle
}
Tente jcabi-http
, que é um cliente HTTP Java fluente, por exemplo:
String html = new JdkRequest("https://www.google.com")
.header(HttpHeaders.ACCEPT, MediaType.TEXT_HTML)
.fetch()
.as(HttpResponse.class)
.assertStatus(HttpURLConnection.HTTP_OK)
.body();
Veja também este post no blog: http://www.yegor256.com/2014/04/11/jcabi-http-intro.html
Use HttpClientBuilder para criar o HttpClient vez de usar DefaultHttpClient
ex:
MinimalHttpClient httpclient = new HttpClientBuilder().build();
// Prepare a request object
HttpGet httpget = new HttpGet("http://www.apache.org/");
Você pode adicionar a seguinte dependência do 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>
Você pode usar a seguinte importação no seu código 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;
Você pode usar o seguinte bloco de código no seu código java.
HttpClient client = HttpClientBuilder.create().build();
HttpUriRequest httpUriRequest = new HttpGet("http://example.domain/someuri");
HttpResponse response = client.execute(httpUriRequest);
System.out.println("Response:"+response);