Pipeline de requisições
O HTTP 1.1 permite o envio de várias requisições em sequência, sem esperar a resposta de cada uma.
Isso melhora a eficiência, especialmente em cenários com alta latência, como em conexões de rede lentas ou quando o servidor demora para processar cada requisição.
Exemplo
Imagine um sistema de e-commerce onde um cliente (navegador ou aplicativo) precisa carregar várias informações de uma página de produto, como:
- Detalhes do produto.
- Avaliações dos usuários.
- Produtos recomendados.
No HTTP 1.1, o cliente pode enviar todas essas requisições em sequência, sem esperar a resposta de cada uma, aproveitando o pipeline de requisições.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpClientPipelineExample {
public static void main(String[] args) {
try {
// URLs das requisições
String[] urls = {
"http://localhost:8080/product-details",
"http://localhost:8080/product-reviews",
"http://localhost:8080/recommended-products"
};
// Envia as requisições em sequência (pipeline)
for (String url : urls) {
sendRequest(url);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static void sendRequest(String urlString) {
try {
URL url = new URL(urlString);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// Configura a requisição
connection.setRequestMethod("GET");
connection.setDoOutput(true);
// Envia a requisição
connection.connect();
// Lê a resposta
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
reader.close();
// Exibe a resposta
System.out.println("Resposta de " + urlString + ": " + response.toString());
// Fecha a conexão
connection.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Usamos um loop for
para simular o envio das requisições em sequência. O método sendRequest
é chamado para cada URL.
Abaixo o código para simular um servidor HTTP utilizando a classe o HttpServer
da biblioteca com.sun.net.httpserver
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
public class SimpleHttpServer {
public static void main(String[] args) throws Exception {
HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
// Endpoint para detalhes do produto
server.createContext("/product-details", new HttpHandler() {
@Override
public void handle(HttpExchange exchange) throws IOException {
String response = "Detalhes do Produto";
exchange.sendResponseHeaders(200, response.length());
OutputStream os = exchange.getResponseBody();
os.write(response.getBytes());
os.close();
}
});
// Endpoint para avaliações do produto
server.createContext("/product-reviews", new HttpHandler() {
@Override
public void handle(HttpExchange exchange) throws IOException {
String response = "Avaliações do Produto";
exchange.sendResponseHeaders(200, response.length());
OutputStream os = exchange.getResponseBody();
os.write(response.getBytes());
os.close();
}
});
// Endpoint para produtos recomendados
server.createContext("/recommended-products", new HttpHandler() {
@Override
public void handle(HttpExchange exchange) throws IOException {
String response = "Produtos Recomendados";
exchange.sendResponseHeaders(200, response.length());
OutputStream os = exchange.getResponseBody();
os.write(response.getBytes());
os.close();
}
});
server.start();
System.out.println("Servidor iniciado na porta 8080...");
}
}
Ao executar o cliente, você verá as respostas das três requisições em sequência no console:
Resposta de http://localhost:8080/product-details: Detalhes do Produto
Resposta de http://localhost:8080/product-reviews: Avaliações do Produto
Resposta de http://localhost:8080/recommended-products: Produtos Recomendados