Introducció

En aquest tema, aprendrem a treballar amb URL i HttpURLConnection en Java per a la comunicació amb servidors web. Aquestes classes ens permeten enviar sol·licituds HTTP i rebre respostes, cosa que és essencial per a la creació d'aplicacions que interactuen amb serveis web.

Conceptes Clau

  • URL (Uniform Resource Locator): És una referència a un recurs web que especifica la seva ubicació en una xarxa i el mecanisme per accedir-hi.
  • HttpURLConnection: És una classe que permet establir una connexió HTTP amb un servidor web, enviar sol·licituds i rebre respostes.

Estructura del Tema

  1. Creació d'un Objecte URL
  2. Establiment d'una Connexió HTTP
  3. Enviament de Sol·licituds GET
  4. Enviament de Sol·licituds POST
  5. Gestió de Respostes
  6. Exemples Pràctics
  7. Exercicis Pràctics

  1. Creació d'un Objecte URL

Per crear un objecte URL, utilitzem la classe URL de Java. Aquesta classe ens permet representar una URL i proporciona mètodes per obtenir informació sobre la URL.

import java.net.URL;

public class URLExample {
    public static void main(String[] args) {
        try {
            URL url = new URL("https://www.example.com");
            System.out.println("Protocol: " + url.getProtocol());
            System.out.println("Host: " + url.getHost());
            System.out.println("Port: " + url.getPort());
            System.out.println("Path: " + url.getPath());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Explicació del Codi

  • URL url = new URL("https://www.example.com"): Crea un objecte URL amb la URL especificada.
  • url.getProtocol(): Retorna el protocol de la URL (per exemple, "https").
  • url.getHost(): Retorna el nom del host de la URL.
  • url.getPort(): Retorna el port de la URL. Si no es especifica, retorna -1.
  • url.getPath(): Retorna el camí de la URL.

  1. Establiment d'una Connexió HTTP

Per establir una connexió HTTP, utilitzem la classe HttpURLConnection. Aquesta classe ens permet enviar sol·licituds HTTP i rebre respostes.

import java.net.HttpURLConnection;
import java.net.URL;

public class HttpURLConnectionExample {
    public static void main(String[] args) {
        try {
            URL url = new URL("https://www.example.com");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            int responseCode = connection.getResponseCode();
            System.out.println("Response Code: " + responseCode);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Explicació del Codi

  • HttpURLConnection connection = (HttpURLConnection) url.openConnection(): Obre una connexió a la URL especificada.
  • connection.setRequestMethod("GET"): Estableix el mètode de sol·licitud HTTP a GET.
  • connection.getResponseCode(): Retorna el codi de resposta de la sol·licitud HTTP.

  1. Enviament de Sol·licituds GET

Les sol·licituds GET s'utilitzen per obtenir dades d'un servidor. A continuació, es mostra un exemple de com enviar una sol·licitud GET i llegir la resposta.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class GetRequestExample {
    public static void main(String[] args) {
        try {
            URL url = new URL("https://jsonplaceholder.typicode.com/posts/1");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");

            int responseCode = connection.getResponseCode();
            System.out.println("Response Code: " + responseCode);

            if (responseCode == HttpURLConnection.HTTP_OK) {
                BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String inputLine;
                StringBuffer response = new StringBuffer();

                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();

                System.out.println("Response: " + response.toString());
            } else {
                System.out.println("GET request failed");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Explicació del Codi

  • BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())): Llegeix la resposta del servidor.
  • response.append(inputLine): Afegeix cada línia de la resposta al StringBuffer.
  • response.toString(): Converteix el StringBuffer a una cadena i la mostra.

  1. Enviament de Sol·licituds POST

Les sol·licituds POST s'utilitzen per enviar dades a un servidor. A continuació, es mostra un exemple de com enviar una sol·licitud POST amb dades JSON.

import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class PostRequestExample {
    public static void main(String[] args) {
        try {
            URL url = new URL("https://jsonplaceholder.typicode.com/posts");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/json; utf-8");
            connection.setRequestProperty("Accept", "application/json");
            connection.setDoOutput(true);

            String jsonInputString = "{\"title\": \"foo\", \"body\": \"bar\", \"userId\": 1}";

            try (OutputStream os = connection.getOutputStream()) {
                byte[] input = jsonInputString.getBytes("utf-8");
                os.write(input, 0, input.length);
            }

            int responseCode = connection.getResponseCode();
            System.out.println("Response Code: " + responseCode);

            if (responseCode == HttpURLConnection.HTTP_CREATED) {
                BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String inputLine;
                StringBuffer response = new StringBuffer();

                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();

                System.out.println("Response: " + response.toString());
            } else {
                System.out.println("POST request failed");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Explicació del Codi

  • connection.setRequestMethod("POST"): Estableix el mètode de sol·licitud HTTP a POST.
  • connection.setRequestProperty("Content-Type", "application/json; utf-8"): Estableix el tipus de contingut de la sol·licitud.
  • connection.setDoOutput(true): Permet l'enviament de dades a través de la connexió.
  • OutputStream os = connection.getOutputStream(): Obté l'OutputStream per enviar dades.
  • os.write(input, 0, input.length): Escriu les dades JSON a l'OutputStream.

  1. Gestió de Respostes

La gestió de respostes implica llegir i processar la resposta del servidor. Ja hem vist com fer-ho en els exemples anteriors utilitzant BufferedReader.

  1. Exemples Pràctics

Exemple 1: Sol·licitud GET

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class GetExample {
    public static void main(String[] args) {
        try {
            URL url = new URL("https://api.github.com");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");

            int responseCode = connection.getResponseCode();
            System.out.println("Response Code: " + responseCode);

            if (responseCode == HttpURLConnection.HTTP_OK) {
                BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String inputLine;
                StringBuffer response = new StringBuffer();

                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();

                System.out.println("Response: " + response.toString());
            } else {
                System.out.println("GET request failed");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Exemple 2: Sol·licitud POST

import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class PostExample {
    public static void main(String[] args) {
        try {
            URL url = new URL("https://jsonplaceholder.typicode.com/posts");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/json; utf-8");
            connection.setRequestProperty("Accept", "application/json");
            connection.setDoOutput(true);

            String jsonInputString = "{\"title\": \"foo\", \"body\": \"bar\", \"userId\": 1}";

            try (OutputStream os = connection.getOutputStream()) {
                byte[] input = jsonInputString.getBytes("utf-8");
                os.write(input, 0, input.length);
            }

            int responseCode = connection.getResponseCode();
            System.out.println("Response Code: " + responseCode);

            if (responseCode == HttpURLConnection.HTTP_CREATED) {
                BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String inputLine;
                StringBuffer response = new StringBuffer();

                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();

                System.out.println("Response: " + response.toString());
            } else {
                System.out.println("POST request failed");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

  1. Exercicis Pràctics

Exercici 1: Sol·licitud GET

Escriu un programa que enviï una sol·licitud GET a l'API de GitHub per obtenir informació sobre un usuari específic i mostri la resposta.

Exercici 2: Sol·licitud POST

Escriu un programa que enviï una sol·licitud POST a l'API de JSONPlaceholder per crear una nova publicació i mostri la resposta.

Solucions

Solució Exercici 1

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class GetUserInfo {
    public static void main(String[] args) {
        try {
            URL url = new URL("https://api.github.com/users/octocat");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");

            int responseCode = connection.getResponseCode();
            System.out.println("Response Code: " + responseCode);

            if (responseCode == HttpURLConnection.HTTP_OK) {
                BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String inputLine;
                StringBuffer response = new StringBuffer();

                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();

                System.out.println("Response: " + response.toString());
            } else {
                System.out.println("GET request failed");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Solució Exercici 2

import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class CreatePost {
    public static void main(String[] args) {
        try {
            URL url = new URL("https://jsonplaceholder.typicode.com/posts");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/json; utf-8");
            connection.setRequestProperty("Accept", "application/json");
            connection.setDoOutput(true);

            String jsonInputString = "{\"title\": \"foo\", \"body\": \"bar\", \"userId\": 1}";

            try (OutputStream os = connection.getOutputStream()) {
                byte[] input = jsonInputString.getBytes("utf-8");
                os.write(input, 0, input.length);
            }

            int responseCode = connection.getResponseCode();
            System.out.println("Response Code: " + responseCode);

            if (responseCode == HttpURLConnection.HTTP_CREATED) {
                BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String inputLine;
                StringBuffer response = new StringBuffer();

                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();

                System.out.println("Response: " + response.toString());
            } else {
                System.out.println("POST request failed");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Conclusió

En aquest tema, hem après a treballar amb URL i HttpURLConnection en Java per enviar sol·licituds HTTP i gestionar respostes. Hem vist com enviar sol·licituds GET i POST, i hem practicat amb exemples i exercicis pràctics. Aquestes habilitats són essencials per a la creació d'aplicacions que interactuen amb serveis web.

Curs de Programació en Java

Mòdul 1: Introducció a Java

Mòdul 2: Flux de Control

Mòdul 3: Programació Orientada a Objectes

Mòdul 4: Programació Orientada a Objectes Avançada

Mòdul 5: Estructures de Dades i Col·leccions

Mòdul 6: Gestió d'Excepcions

Mòdul 7: Entrada/Sortida de Fitxers

Mòdul 8: Multithreading i Concurrència

Mòdul 9: Xarxes

Mòdul 10: Temes Avançats

Mòdul 11: Frameworks i Llibreries de Java

Mòdul 12: Construcció d'Aplicacions del Món Real

© Copyright 2024. Tots els drets reservats