JavaRush /Java Blog /Random-IT /Servizi web. Passaggio 1. Cos'è un servizio web e come ut...
eGarmin
Livello 41

Servizi web. Passaggio 1. Cos'è un servizio web e come utilizzarlo?

Pubblicato nel gruppo Random-IT
Il titolo dell'argomento è davvero una domanda, perché... Io stesso non so cosa sia e per la prima volta proverò a lavorarci nell'ambito di questo articolo. L'unica cosa che posso garantire è che il codice presentato di seguito funzionerà, ma le mie frasi saranno solo supposizioni e ipotesi su come io stesso comprendo tutto questo. Quindi andiamo... Servizi web.  Passaggio 1. Cos'è un servizio web e come utilizzarlo?  -1

introduzione

Dobbiamo iniziare dal motivo per cui è stato creato il concetto di servizi web. Quando questo concetto è apparso nel mondo, esistevano già tecnologie che consentivano alle applicazioni di interagire a distanza, dove un programma poteva chiamare un metodo in un altro programma, che poteva essere avviato su un computer situato in un'altra città o addirittura paese. Tutto questo è abbreviato in RPC (Remote Procedure Calling). Gli esempi includono le tecnologie CORBA e per Java - RMI (Remote Method Invoking). E tutto sembra andare bene in loro, soprattutto in CORBA, perché... Puoi lavorarci in qualsiasi linguaggio di programmazione, ma mancava ancora qualcosa. Credo che lo svantaggio di CORBA sia che funziona attraverso alcuni dei suoi protocolli di rete invece del semplice HTTP, che può passare attraverso qualsiasi firewall. L'idea del servizio web era quella di creare un RPC da inserire nei pacchetti HTTP. Inizia così lo sviluppo dello standard. Quali sono i concetti base di questa norma:
  1. SAPONE . Prima di chiamare una procedura remota, è necessario descrivere questa chiamata in un file XML in formato SOAP. SOAP è semplicemente uno dei tanti markup XML utilizzati nei servizi Web. Tutto ciò che vogliamo inviare da qualche parte tramite HTTP viene prima convertito in una descrizione SOAP XML, quindi inserito in un pacchetto HTTP e inviato a un altro computer sulla rete tramite TCP/IP.
  2. WSDL . Esiste un servizio web, ad es. un programma i cui metodi possono essere chiamati in remoto. Ma lo standard richiede che questo programma sia accompagnato da una descrizione che dice: "sì, hai ragione, questo è davvero un servizio web e da esso puoi chiamare questi e quei metodi". Questa descrizione è rappresentata da un altro file XML, che ha un formato diverso, vale a dire WSDL. Quelli. WSDL è solo un file XML che descrive un servizio web e niente di più.
Perché chiedi così brevemente? Non puoi essere più specifico? Probabilmente è possibile, ma per farlo dovrai rivolgerti a libri come T. Mashnin, “Java Web Services”. Lì, nelle prime 200 pagine, c'è una descrizione dettagliata di ogni tag degli standard SOAP e WSDL. Vale la pena farlo? Secondo me no, perché... tutto questo viene creato automaticamente in Java e devi solo scrivere il contenuto dei metodi che dovrebbero essere chiamati da remoto. Quindi, in Java è apparsa un'API come JAX-RPC. Se qualcuno non lo sa, quando dicono che Java ha questa o quella API, significa che esiste un pacchetto con un insieme di classi che incapsulano la tecnologia in questione. JAX-RPC si è evoluto nel tempo da una versione all'altra e alla fine è diventato JAX-WS. WS sta ovviamente per WebService e potresti pensare che si tratti semplicemente di una ridenominazione di RPC come parola d'ordine popolare di questi tempi. Questo non è vero, perché Ora i servizi web si sono allontanati dall'idea originale e consentono non solo di chiamare metodi remoti, ma anche semplicemente di inviare messaggi di documenti in formato SOAP. Non so ancora perché sia ​​necessario; è improbabile che la risposta qui sia “nel caso fosse necessario”. Io stesso vorrei imparare da compagni più esperti. Infine è apparso JAX-RS per i cosiddetti servizi web RESTful, ma questo è argomento di un articolo a parte. L'introduzione può finire qui, perché... Successivamente impareremo a lavorare con JAX-WS.

Approccio generale

Nei servizi web c'è sempre un client e un server. Il server è il nostro servizio Web e talvolta viene chiamato endpoint (come in, il punto finale dove raggiungono i messaggi SOAP dal client). Dobbiamo fare quanto segue:
  1. Descrivi l'interfaccia del nostro servizio web
  2. Implementare questa interfaccia
  3. Avvia il nostro servizio web
  4. Scrivere un client e chiamare in remoto il metodo del servizio Web desiderato
Puoi avviare un servizio Web in diversi modi: descrivere una classe con un metodo maine avviare il servizio Web direttamente come server oppure distribuirlo su un server come Tomcat o qualsiasi altro. Nel secondo caso, noi stessi non lanciamo un nuovo server e non apriamo un'altra porta sul computer, ma diciamo semplicemente al contenitore servlet Tomcat che "abbiamo scritto classi di servizi web qui, per favore pubblicale in modo che tutti coloro che ti contattano possano utilizzare il nostro servizio web." Indipendentemente dal metodo di avvio del servizio web, avremo lo stesso client.

server

Lanciamo IDEA e creiamo un nuovo progetto Crea nuovo progetto . Specificare il nome HelloWebService e fare clic sul pulsante Avanti , quindi sul pulsante Fine . Nella cartella src creeremo il pacchetto ru.javarush.ws . In questo pacchetto creeremo un'interfaccia HelloWebService:
package ru.javarush.ws;

// это аннотации, т.е. способ отметить наши классы и методы,
// How связанные с веб-сервисной технологией
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

// говорим, что наш интерфейс будет работать How веб-сервис
@WebService
// говорим, что веб-сервис будет использоваться для вызова методов
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface HelloWebService {
    // говорим, что этот метод можно вызывать удаленно
    @WebMethod
    public String getHelloString(String name);
}
In questo codice, le classi sono le cosiddette annotazioni WebServicee WebMethodnon fanno altro che contrassegnare la nostra interfaccia e il suo metodo come servizio web. Lo stesso vale per la classe SOAPBinding. L'unica differenza è che SOAPBindingsi tratta di un'annotazione con parametri. In questo caso viene utilizzato un parametro stylecon un valore che indica che il servizio web funzionerà non tramite messaggi di documento, ma come un classico RPC, cioè per chiamare un metodo. Implementiamo la logica dell'interfaccia e creiamo una classe nel nostro pacchetto HelloWebServiceImpl. A proposito, noto che terminare una classe con Impl è una convenzione in Java, secondo la quale l'implementazione delle interfacce è così designata (Impl - dalla parola implementazione, cioè implementazione). Questo non è un requisito e sei libero di nominare la classe come preferisci, ma le buone maniere lo richiedono:
package ru.javarush.ws;

// таже annotation, что и при описании интерфейса,
import javax.jws.WebService;

// но здесь используется с параметром endpointInterface,
// указывающим полное Name класса интерфейса нашего веб-сервиса
@WebService(endpointInterface = "ru.javarush.ws.HelloWebService")
public class HelloWebServiceImpl implements HelloWebService {
    @Override
    public String getHelloString(String name) {
        // просто возвращаем приветствие
        return "Hello, " + name + "!";
    }
}
Lanciamo il nostro servizio web come server indipendente, ad es. senza la partecipazione di Tomcat e server delle applicazioni (questo è un argomento per una discussione separata). Per fare ciò, nella struttura del progetto nella cartella src , creeremo un pacchetto ru.javarush.endpointe in esso creeremo una classe HelloWebServicePublishercon un metodo main:
package ru.javarush.endpoint;

// класс, для запуска веб-serverа с веб-сервисами
import javax.xml.ws.Endpoint;
// класс нашего веб-сервиса
import ru.javarush.ws.HelloWebServiceImpl;

public class HelloWebServicePublisher {
    public static void main(String... args) {
        // запускаем веб-server на порту 1986
        // и по addressу, указанному в первом аргументе,
        // запускаем веб-сервис, передаваемый во втором аргументе
        Endpoint.publish("http://localhost:1986/wss/hello", new HelloWebServiceImpl());
    }
}
Ora eseguiamo questa classe premendo Shift+F10 . Non apparirà nulla nella console, ma il server è in esecuzione. Puoi verificarlo digitando la riga http://localhost:1986/wss/hello?wsdl nel tuo browser . La pagina che si apre dimostra da un lato che abbiamo un server web (http://) in esecuzione sulla porta 1986 del nostro computer (localhost) e dall'altro mostra una descrizione WSDL del nostro servizio web. Se interrompi l'applicazione, la descrizione non sarà più disponibile, così come il servizio web stesso, quindi non lo faremo, ma passeremo alla scrittura del client.

Cliente

Nella cartella del progetto src creeremo un pacchetto ru.javarush.cliente in esso una classe HelloWebServiceClientcon un metodo main:
package ru.javarush.client;

// нужно, чтобы получить wsdl описание и через него
// дотянуться до самого веб-сервиса
import java.net.URL;
// такой эксепшн возникнет при работе с an objectом URL
import java.net.MalformedURLException;

// классы, чтобы пропарсить xml-ку c wsdl описанием
// и дотянуться до тега service в нем
import javax.xml.namespace.QName;
import javax.xml.ws.Service;

// интерфейс нашего веб-сервиса (нам больше и нужно)
import ru.javarush.ws.HelloWebService;

public class HelloWebServiceClient {
    public static void main(String[] args) throws MalformedURLException {
        // создаем ссылку на wsdl описание
        URL url = new URL("http://localhost:1986/wss/hello?wsdl");

        // Параметры следующего конструктора смотрим в самом первом теге WSDL описания - definitions
        // 1-ый аргумент смотрим в атрибуте targetNamespace
        // 2-ой аргумент смотрим в атрибуте name
        QName qname = new QName("http://ws.javarush.ru/", "HelloWebServiceImplService");

        // Теперь мы можем дотянуться до тега service в wsdl описании,
        Service service = Service.create(url, qname);
        // а далее и до вложенного в него тега port, чтобы
        // получить ссылку на удаленный от нас an object веб-сервиса
        HelloWebService hello = service.getPort(HelloWebService.class);

        // Ура! Теперь можно вызывать удаленный метод
        System.out.println(hello.getHelloString("JavaRush"));
    }
}
Ho dato il massimo dei commenti sul codice nell'elenco. Non ho nulla da aggiungere, quindi eseguiamo (Shift+F10). Dovremmo vedere il testo nella console: Hello, JavaRush!Se non l'hai visto, probabilmente hai dimenticato di avviare il servizio web.

Conclusione

Questo argomento ha fornito una breve escursione ai servizi web. Ancora una volta, dirò che gran parte di ciò che ho scritto è una mia ipotesi su come funziona, e quindi non dovresti fidarti troppo di me. Sarei grato se le persone esperte mi correggessero, perché così imparerò qualcosa. AGGIORNAMENTO. Continuiamo la conversazione
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION