Obiettivi della lezione:
- Comprendere i concetti fondamentali dei protocolli SOAP e GraphQL. Gli studenti impareranno a identificare e descrivere i protocolli SOAP e GraphQL e il loro ruolo nelle applicazioni distribuite.
- Analizzare le caratteristiche, vantaggi e svantaggi di SOAP e GraphQL. Gli studenti acquisiranno conoscenze sulle peculiarità di ciascun protocollo.
- Esempi di implementazione di API SOAP e GraphQL in JavaScript. Gli studenti comprenderanno come creare e consumare API utilizzando JavaScript.
Introduzione ai protocolli SOAP e GraphQL
SOAP (Simple Object Access Protocol) e GraphQL sono due protocolli utilizzati per la comunicazione tra sistemi distribuiti. Mentre SOAP è basato su XML ed è stato uno dei primi protocolli per web services, GraphQL è un linguaggio di query moderno che permette ai client di specificare esattamente i dati di cui hanno bisogno.
SOAP (Simple Object Access Protocol)
SOAP è un protocollo basato su XML che consente lo scambio di informazioni strutturate tra applicazioni in modo indipendente dalla piattaforma e dal linguaggio di programmazione. SOAP è stato uno dei primi protocolli sviluppati per i web services e viene ancora ampiamente utilizzato in contesti aziendali e di integrazione complessi.
Caratteristiche principali di SOAP
- Formato basato su XML: SOAP utilizza XML per formattare i messaggi, garantendo una struttura ben definita e leggibile sia per gli esseri umani che per le macchine.
- Indipendenza dalla piattaforma: SOAP può essere utilizzato su vari protocolli di trasporto come HTTP, SMTP e TCP.
- Estensibilità: SOAP supporta estensioni per sicurezza, transazioni e altro ancora, grazie alla sua architettura modulare e alla capacità di includere intestazioni personalizzate nei messaggi.
Struttura di un messaggio SOAP
Un messaggio SOAP è composto da quattro parti principali:
- Envelope: È l’elemento radice che racchiude l’intero messaggio e definisce il namespace.
- Header (opzionale): Contiene informazioni di controllo e meta-dati utili per la gestione del messaggio.
- Body: Contiene il contenuto del messaggio, ovvero i dati che devono essere scambiati tra il client e il server.
- Fault (opzionale): Fornisce informazioni sugli errori che si verificano durante l’elaborazione del messaggio.
Esempio di richiesta SOAP
POST /WebServiceEndpoint HTTP/1.1
Host: www.example.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://www.example.com/Action"
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:example="http://www.example.com">
<soap:Header/>
<soap:Body>
<example:MyFunction>
<example:Parameter1>Value1</example:Parameter1>
<example:Parameter2>Value2</example:Parameter2>
</example:MyFunction>
</soap:Body>
</soap:Envelope>
Immagine suggerita: Diagramma che mostra la struttura di un messaggio SOAP con intestazioni e corpo.
Vantaggi e Svantaggi di SOAP
- Vantaggi:
- Standardizzazione: Supportato da molti standard internazionali, rendendolo ideale per applicazioni enterprise.
- Sicurezza: Include specifiche per la sicurezza come WS-Security.
- Affidabilità: Supporta protocolli per la gestione delle transazioni e la garanzia della consegna dei messaggi.
- Svantaggi:
- Verboso: I messaggi XML possono essere molto lunghi, causando un aumento del traffico di rete.
- Complessità: La configurazione e la gestione dei web services SOAP possono essere più complesse rispetto ad altre soluzioni più leggere come REST.
GraphQL
GraphQL è un linguaggio di query per API sviluppato da Facebook che consente ai client di richiedere esattamente i dati di cui hanno bisogno e nulla di più. GraphQL offre un’alternativa flessibile e potente ai tradizionali web services RESTful.
Caratteristiche principali di GraphQL
- Richieste flessibili: I client possono specificare esattamente quali dati necessitano, riducendo il carico di dati trasmessi.
- Single endpoint: Tutte le operazioni (query, mutazioni) sono effettuate su un singolo endpoint, semplificando la gestione delle API.
- Tipizzazione forte: GraphQL utilizza un sistema di tipi che definisce la struttura dei dati disponibili, migliorando la coerenza e la validazione.
Esempio di richiesta GraphQL
query {
user(id: 1) {
id
name
email
}
}
Risposta GraphQL
{
"data": {
"user": {
"id": 1,
"name": "John Doe",
"email": "johndoe@example.com"
}
}
}
Immagine suggerita: Diagramma che mostra la struttura di una richiesta e risposta GraphQL.
Vantaggi e Svantaggi di GraphQL
- Vantaggi:
- Flessibilità: Permette ai client di richiedere esattamente ciò di cui hanno bisogno, riducendo il sovraccarico di dati.
- Performance: Riduce il numero di richieste necessarie aggregando più query in una singola richiesta.
- Evolvibilità: Facilita l’aggiunta di nuovi campi e tipi senza interrompere le query esistenti.
- Svantaggi:
- Complessità: Richiede una curva di apprendimento per comprendere e implementare correttamente.
- Overhead: La singola richiesta a un endpoint può diventare complessa da gestire sul server.
Esempi di implementazione di API SOAP e GraphQL in JavaScript
Implementazione di una semplice API SOAP
- Installazione di un server SOAP con Node.js:
npm install soap
- Codice di esempio per un server SOAP:
const soap = require('soap');
const express = require('express');
const app = express();
const port = 3000;
const myService = {
MyService: {
MyPort: {
MyFunction: function(args) {
return { result: `Hello ${args.name}` };
}
}
}
};
const xml = require('fs').readFileSync('myservice.wsdl', 'utf8');
app.listen(port, function() {
soap.listen(app, '/wsdl', myService, xml, function() {
console.log(`Server running at http://localhost:${port}/`);
});
});
In questo esempio, utilizziamo la libreria soap
per creare un semplice server SOAP che espone un servizio con una funzione che restituisce un saluto personalizzato.
Implementazione di una query GraphQL con Node.js e Apollo Server
- Installazione di Apollo Server:
npm install apollo-server graphql
- Codice di esempio per un server GraphQL:
const { ApolloServer, gql } = require('apollo-server');
const typeDefs = gql`
type User {
id: ID!
name: String!
email: String!
}
type Query {
users: [User]
user(id: ID!): User
}
type Mutation {
addUser(name: String!, email: String!): User
}
`;
let users = [
{ id: '1', name: 'John Doe', email: 'johndoe@example.com' },
{ id: '2', name: 'Jane Doe', email: 'janedoe@example.com' }
];
const resolvers = {
Query: {
users: () => users,
user: (parent, args) => users.find(user => user.id === args.id)
},
Mutation: {
addUser: (parent, args) => {
const user = {
id: `${users.length + 1}`,
name: args.name,
email: args.email
};
users.push(user);
return user;
}
}
};
const server = new ApolloServer({ typeDefs, resolvers });
server.listen().then(({ url }) => {
console.log(`🚀 Server ready at ${url}`);
});
In questo esempio, utilizziamo Apollo Server per creare un’API GraphQL che consente di recuperare l’elenco degli utenti, recuperare un utente specifico per ID e aggiungere un nuovo utente. Definiamo lo schema GraphQL con typeDefs
e implementiamo i resolver per gestire le query e le mutazioni.
Esercitazioni pratiche
Esercitazione 1: Implementazione di un web service SOAP
- Obiettivo:
- Creare un web service SOAP utilizzando un linguaggio di programmazione a scelta (ad esempio, Java o C#) e testare le richieste e risposte SOAP.
- Attività:
- Configurare un WSDL (Web Services Description Language) per descrivere il servizio.
- Implementare il servizio utilizzando la libreria SOAP appropriata per il linguaggio scelto.
- Utilizzare strumenti come SoapUI per testare le richieste e risposte SOAP.
- Passaggi:
- Java:
- Creare un progetto Java e aggiungere la dipendenza per JAX-WS.
- Definire l’interfaccia del servizio web.
- Implementare la classe del servizio web.
- Pubblicare il servizio web utilizzando
Endpoint.publish()
. - Utilizzare SoapUI per creare un progetto e testare il servizio.
- C#:
- Creare un progetto ASP.NET Web Application.
- Aggiungere un nuovo servizio WCF (Windows Communication Foundation).
- Definire il contratto del servizio e implementarlo.
- Configurare il WSDL.
- Utilizzare SoapUI per creare un progetto e testare il servizio.
Esercitazione 2: Creazione di un’API GraphQL
- Obiettivo:
- Creare un server GraphQL utilizzando un linguaggio di programmazione a scelta (ad esempio, JavaScript con Apollo Server) e definire uno schema GraphQL per eseguire query e mutazioni.
- Attività:
- Installare e configurare Apollo Server.
- Definire il tipo di schema GraphQL.
- Implementare i resolver per le query e le mutazioni.
- Testare le richieste utilizzando GraphiQL o Apollo Client.
- Passaggi:
- JavaScript con Apollo Server:
- Creare un nuovo progetto Node.js e installare le dipendenze necessarie (
apollo-server
egraphql
). - Definire i tipi di schema e le operazioni nel file schema.
- Implementare i resolver per gestire le operazioni definite nello schema.
- Avviare il server Apollo e utilizzare GraphiQL per testare le query e le mutazioni.
- Creare un nuovo progetto Node.js e installare le dipendenze necessarie (
- Java:
- Utilizzare un framework come
graphql-java
. - Configurare un progetto Maven o Gradle e aggiungere le dipendenze per GraphQL.
- Definire lo schema GraphQL utilizzando SDL (Schema Definition Language) o Java DSL.
- Implementare i resolver per gestire le richieste GraphQL.
- Avviare il server e utilizzare GraphiQL per testare le operazioni.
- Utilizzare un framework come