Web-service di tipo REST: interazione con Java per richieste HTTP

Slide dall'Università sui web-service di tipo REST. Il Pdf esplora l'interazione con web-service REST tramite Java, focalizzandosi su HttpURLConnection e il package java.net.http. Questo documento di Informatica, utile per l'Università, include esempi di codice e una tabella riassuntiva delle interfacce e classi fondamentali.

Mostra di più

28 pagine

Web-service di tipo REST
Interazione con linguaggio Java
Il linguaggio di programmazione Java rende disponibili due diversi approcci per interagire con un
web-service di tipo REST utilizzando il protocollo HTTP lato client:
1. utilizzare la classe HttpURLConnection del package java.net;
a. La classe HttpURLConnection consente solo interazioni sincrone e il programmatore è
eventualmente obbligato a impiegare in modo esplicito i thread per separare l’inoltro delle
richieste al web server dalla ricezione delle relative risposte
Interazione con web-service di tipo REST/1

Visualizza gratis il Pdf completo

Registrati per accedere all’intero documento e trasformarlo con l’AI.

Anteprima

Interazione con web-service di tipo REST

Il linguaggio di programmazione Java rende disponibili due diversi approcci per interagire con un web-service di tipo REST utilizzando il protocollo HTTP lato client:

  1. utilizzare la classe HttpURLConnection del package java. net;
    1. La classe HttpURLConnection consente solo interazioni sincrone e il programmatore è eventualmente obbligato a impiegare in modo esplicito i thread per separare l'inoltro delle richieste al web server dalla ricezione delle relative risposteInterazione con web-service di tipo REST/2
  2. ricorrere alla classe HttpClient del package java. net . http introdotto con la versione 11 del linguaggio rilasciata nel 2018.
    1. invece, la classe HttpClient consente interazioni asincrone prevedendo l'uso di un future per verificare in modo asincrono la ricezione di una risposta a fronte dell'invio di una richiesta.

In entrambi i casi la richiesta trasmessa al server prevede un URL la cui query-string è normalmente composta dinamicamente a partire da dati variabili: l'URL-encoding può essere effettuato invocando il metodo statico encode della classe URLEncoder del package java. netInterazione con web-service REST: HttpURLConnection Interagire con un web-service REST mediante un programma sviluppato con il linguaggio di programmazione Java è relativamente semplice ricorrendo alle funzionalità della classe URLConnection, i cui metodi fondamentali sono descritti nella TABELLAMetodo Descrizione

Metodi HttpURLConnection

void setRequestProperty(String Key, String value) Imposta mediante una coppia chiave/valore un header di richiesta. void setConnectTimeout (int ms) Imposta il tempo massimo di attesa in millisecondi per la richiesta di connessione. void setReadTimeout (int ms) Imposta il tempo massimo di attesa in millisecondi per la ricezione di dati. void setDoInput (boolean active) Abilita/disabilita la ricezione dati dalla risorsa web. void setDoOutput (boolean active) Abilita/disabilita la trasmissione dati verso la risorsa web. void connect () Esegue la connessione alla risorsa web identificata dall'URL fornito come argomento del costruttore. int getContentLength() Restituisce il valore dello header content-length della risposta. String getContentType() Restituisce il valore dello header content-type della risposta. String getContentEncoding() Restituisce il valore dello header content-encoding della risposta. long getDate() Restituisce il valore dello header date della risposta (ms trascorsi da 00:00:00 1/1/1970). long getExpiration() Restituisce il valore dello header expires della risposta (ms trascorsi da 00:00:00 1/1/1970). long getLastModified() Restituisce il valore dello header last-modified della risposta (ms trascorsi da 00:00:00 1/1/1970). InputStream getInputStream() Restituisce lo stream per la ricezione del contenuto del body della risposta. OutputStream getOutputStream() Restituisce lo stream per la trasmissione del body della richiesta.La classe derivata HttpURLConnection estende URLConnection aggiungendo alcuni metodi per la gestione delle caratteristiche specifiche del protocollo HTTP, tra cui quelli riportati nella TABELLA seguente. Dalla classe HttpURLConnection deriva la classe HttpsURLConnection che gestisce il protocollo sicuro HTTPS anziché HTTP: normalmente non è necessario operare in modo diverso utilizzando l'una o l'altra classe. La classe HttpURLConnection definisce come attributi statici tutti i possibili valori del codice di stato di una risposta del protocollo HTTP. Al fine di permetterne diverse implementazioni da parte degli sviluppatori delle Java Virtual Machine, le classi URLConnection, HttpURLConnection e HttpsURLConnection sono astratte: il modo più semplice per istanziarle è invocare il metodo openConnection di un oggetto di classe URL che restituisce un oggetto di classe URLConnection del quale può essere effettuato un cast alle classi HttpURLConnection o HttpsURLConnection. Costruttori URL DEPRECATED -> vedi URI

Metodi HttpURLConnection specifici

Metodo Descrizione void setRequestMethod (String method) Imposta il metodo HTTP di richiesta (GET, POST, HEAD, OPTIONS, PUT, DELETE o TRACE). int getResponseCode () Restituisce lo status-code della risposta HTTP. String getResponseMessage() Restituisce il messaggio relativo allo status-code della risposta HTTP. void disconnect () Esegue la disconnessione dalla risorsa web.Esempio Il costruttore della seguente classe interroga il servizio Google maps che restituisce l'altitudine di un luogo e salva in un file di testo la risposta ricevuta in formato XML:/ * * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license * | package com.mycompany.elevation01;

Esempio di classe Elevation01

/ ** COORDINATE DUOMO * 45.464098 9.191926 alt_duomo.txt * * @author cristianodaros * 1 import java.io .*; import java.net .*; import javax.xml.parsers .*; import org.w3c.dom .*; import org.xml.sax.SAXException; import javax.net.ssl .*; class ElevationException extends Exception { }public class Elevation01 { private String prefix = "https://maps.googleapis.com/maps/api/elevation/xml?locations="; private String suffix = "&key =... "; private String filename; private boolean saved = false; private String url; private boolean parsed = false; private double altitude; public Elevation01(float latitude, float longitude, String filename) { URL server; URI serverUri; HttpsURLConnection service; BufferedReader input; BufferedWriter output; String line; String location; int status; this.filename = filename; try { // costruzione dello URL di interrogazione del servizio location = Float.toString(latitude) + "," + Float.toString(longitude); url = prefix + URLEncoder.encode(location, "UTF-8") + suffix; System.out.println("url :" + url); // deprecated from JDK 20 //server = new URL(url);serverUri = new URI(url); server = serverUri.toURL(); service = (HttpsURLConnection)server.openConnection(); // impostazione header richiesta service.setRequestProperty("Host", "maps.googleapis.com"); service.setRequestProperty("Accept", "application/json"); service.setRequestProperty("Accept-Charset", "UTF-8"); // impostazione metodo di richiesta GET service.setRequestMethod("GET"); // attivazione ricezione service.setDoInput(true); // connessione al servizio service.connect(); // verifica codice di stato risposta status = service.getResponseCode(); if (status != 200) { return; // errore } // apertura stream di ricezione da risorsa web input = new BufferedReader(new InputStreamReader(service.getInputStream(), "UTF-8")); // apertura stream per scrittura su file output = new BufferedWriter(new FileWriter(filename)); // ciclo di lettura da web e scrittura su file while ((line = input.readLine()) != null) { output.write(line); output.newLine(); }input.close(); output.close(); saved = true; } catch (URISyntaxException e){ System.err.println("URISyntaxException: "+e);} catch (MalformedURLException e) { System.err.println("MalformedURLException: "+e);} catch (IOException e) { System.err.println("IOException: "+e);} } public boolean isSaved() { return saved; } private void parseFile() throws ElevationException { if (!saved) { throw new ElevationException(); } try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); // costruzione albero DOM del file XML Document document = builder.parse(filename); // estrazione elemento radice Element root = document.getDocumentElement(); // acquisizione e verifica dello stato della risposta NodeList list = root.getElementsByTagName("status");if (list != null && list.getLength() > 0) { if (!list.item(0).getFirstChild().getNodeValue().equalsIgnoreCase("OK")) { throw new ElevationException(); } // acquisizione valore elemento elevazione list = root.getElementsByTagName("elevation"); if (list != null && list.getLength() > 0) { altitude = Double.parseDouble(list.item(0).getFirstChild().getNodeValue()); parsed = true; } } } catch (NumberFormatException ex) { throw new ElevationException(); } catch (ParserConfigurationException ex) { throw new ElevationException(); } catch (SAXException ex) { throw new ElevationException(); } catch (IOException ex) { throw new ElevationException(); } }public boolean isParsed() { return parsed; } public double getAltitude() throws ElevationException { if (!saved) throw new ElevationException(); if (!parsed) parseFile(); return altitude; } public static void main(String[] args) { float latitude, longitude; String filename; latitude = Float.parseFloat(args[0]); longitude = Float.parseFloat(args[1]); filename = args[2]; Elevation01 elevation = new Elevation01(latitude, longitude, filename); if (elevation.isSaved()) { try { System.out.println("Risultato: " + elevation.getAltitude()); } catch (ElevationException ex) { System.out.println("Errore risposta servizio."); } } else System.out.println("Errore interrogazione servizio."); } }Il metodo main esemplifica l'uso della classe: ne crea un'istanza che automaticamente genera un file in formato XML solo se si è ricevuta una risposta da parte del servizio; nel codice dell'esempio le coordinate geografiche e il nome del file sono forniti come argomenti della riga di comando. Molti web-service accettano richieste e producono risposte in formato JSON o XML: di conseguenza, la generazione e il parsing di documenti in questi formati è una funzionalità essenziale delle applicazioni che espongono o interrogano web-service.

Interazione con web-service REST: HttpClient

Le interfacce e le classi fondamentali del package java. net.http sono riportate nella TABELLA

Interfaccia o classe HttpClient

Funzionalità HttpClient Gli oggetti istanza di questa classe sono impiegati per la trasmissione di richieste al server HTTP in modalità sincrona o asincrona e la ricezione delle relative risposte. HttpClient.Builder Interfaccia che consente di istanziare e configurare un oggetto di classe HttpClient. HttpRequest Classe che rappresenta una richiesta HTTP. HttpRequest. Builder Interfaccia che consente di istanziare e configurare un oggetto di classe HttpRequest. HttpRequest. BodyPublish er Interfaccia funzionale per un oggetto che converte oggetti del linguaggio Java nel flusso di byte che costituisce un body della richiesta HTTP. HttpRequest . BodyPublish ers Implementazione dell'interfaccia BodyPublisher che consente di convertire stringhe e file in un body della richiesta HTTP. HttpResponse Interfaccia generica che rappresenta una risposta HTTP.

Non hai trovato quello che cercavi?

Esplora altri argomenti nella Algor library o crea direttamente i tuoi materiali con l’AI.