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
- Creació d'un Objecte URL
- Establiment d'una Connexió HTTP
- Enviament de Sol·licituds GET
- Enviament de Sol·licituds POST
- Gestió de Respostes
- Exemples Pràctics
- Exercicis Pràctics
- 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.
- 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.
- 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.
- 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.
- 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
.
- 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(); } } }
- 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
- Introducció a Java
- Configuració de l'Entorn de Desenvolupament
- Sintaxi i Estructura Bàsica
- Variables i Tipus de Dades
- Operadors
Mòdul 2: Flux de Control
Mòdul 3: Programació Orientada a Objectes
- Introducció a la POO
- Classes i Objectes
- Mètodes
- Constructors
- Herència
- Polimorfisme
- Encapsulació
- Abstracció
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
- Lectura de Fitxers
- Escriptura de Fitxers
- Fluxos de Fitxers
- BufferedReader i BufferedWriter
- Serialització
Mòdul 8: Multithreading i Concurrència
- Introducció al Multithreading
- Creació de Fils
- Cicle de Vida dels Fils
- Sincronització
- Utilitats de Concurrència
Mòdul 9: Xarxes
- Introducció a les Xarxes
- Sockets
- ServerSocket
- DatagramSocket i DatagramPacket
- URL i HttpURLConnection