Newsgroup: it.comp.java
Titolo: Web service? Ma dove?

La domanda è retorica: mi sembra di non riuscire a trovare una soluzione ad
un problema banale, che in questa epoca di web service sembra ridicolo... In
parole povere ho un database in un hosting, la porta del database è chiusa
per motivi di sicurezza(suppongo) ma devo accedervi con un programma
installato in locale. Possibile che non ci sia modo di accedere al db remoto
con un programmino Java senza usare un browser? L'unica soluzione è avere un
server proprio e avere aperta la connessione diretta alla porta? Java può
simulare un browser e superare il problema? Sto dicendo c*****e alle 2.00 di
domenica mattina?

 mattina? 
Si all'ultima domanda :-)
Non ti è chiara l'architettura. Il browser lo dovresti vedere come client 
generico "stupido", in realtà il programma sta sul server remoto ed è lui 
che accede ai dati. Il browser non fa nientaltro che input/output per il 
programma remoto (in modo più o meno sofisticato). 

 programma remoto (in modo più o meno sofisticato).
Ora mi rendo conto, non ci avevo pensato. Una soluzione potrebbe essere lo
scambio di dati tramite file xml? Quali problemi ci potrebbero essere? Uno
che mi viene in mente subito è che un dump del database in xml ad ogni
modifica probabilmente richiederebbe troppo tempo(su tabelle da 10.000
righe)... o sbaglio ed è possibile aggiornare un file xml solo "dove serve"?

 con un programmino Java senza usare un browser?
Mille, ma non gratis. :) Uno (teorico) lo scrivi tu: implementa (o 
installa) un webservice che espone l'accesso al database con le garanzie di 
sicurezza che desideri. Piu' semplicemente, costruisci una servlet (o 
qualunque cosa che parli HTTP) che supporti le tue richieste. Oppure - 
visto che ci arrivi da un browser, fai le stesse richieste di un browser 
usando URL/URLConnection programmaticamente. Eccetera. 
-- 
Life's something u don't get out alive..
ObjectZone - 
http://space.tin.it/computer/csadun

 usando URL/URLConnection programmaticamente.
Questa ipotesi mi interessa particolarmente, ma non capisco come potrei
fare: mi puoi spiegare meglio?

 fare: mi puoi spiegare meglio?
Guarda la documentazione di java.net.URL e java.net.URLConnection: e' 
spiegato tutto li'.


 spiegato tutto li'.
Non capisco una cosa banale: come mi connetto al database via url se la
porta del database stessa è chiusa? Riesco solo ad eseguire query in
Php(residenti sul server) sul db...

 Php(residenti sul server) sul db...
Ehm, se dici che ci riesci da php residenti sul server, non ci stai 
riuscendo "da browser", ma appunto dalle pagine PHP.
Nel qual caso, non ti serve a niente poter emulare un browser.


 Nel qual caso, non ti serve a niente poter emulare un browser.
Ah... ecco. Boh! Qualche consiglio per connettersi direttamente al db? Se si
puň... Posso fare eseguire delle pagine Php via Java e restituire a Java il
risultato? L'ho sparata grossa mi sa, sono al delirio... :)

 delirio... :) 
Si', puoi farlo - e' equivalente a costruire la servlet di cui dicevo - 
praticamente ti costruisci un "web service" personalizzato, appunto.
Ma scusa, non capisco una cosa. O hai accesso al server, oppure no.
Il fatto che tu possa aggiungere pagine PHP fa pensare tu ce l'abbia; 
ora, se puoi aggiungere pagine PHP, puoi aggiungere qualunque cosa - e a 
quel punto e' meglio una servlet. O forse non c'e' un servlet engine sul 
server di cui parli?


 server di cui parli?
Non saprei, io ho un hosting e tra le specifiche non compare... Devo dire
che trovare un hosting italiano che supporti servlet e jsp non č tanto
semplice, stranamente...
Tornando al discorso, io l'accesso al server ovviamente ce l'ho in ftp, ma
una volta avevo l'accesso diretto anche alla porta(credo) del database (del
tipo: 
www.dominio.com/database?user&pass..
.) quindi riuscivo a connettermi
tranquillamente in Java con le jdbc... Ora non ho piů i permessi(da remoto),
quindi devo arrangiarmi. Ma non ho la minima idea di come costruirmi il web
service in Java - Php, anche se ho capito il concetto. Da dove inizio?
Grazie per la pazienza...

 
L'idea e' che la tua servlet/pagina PHP (funzionalmente fanno la stessa 
cosa, sono solo diverse tecnologie) riconosca dei "comandi" inviati come 
parametri della richiesta HTTP, e rispedisca indietro il relativo 
risultato, che la tua applet interpretera' opportunamente. Che comandi 
precisamente, e con quali modalita', dipende da quello che vuoi fare.
I comandi verrano inviati (e le risposte ricevute) dall'applet via 
URL/URLConnection. Ad esempio, a fronte di una richiesta 
(completamente inventata) http://.../miaphp?cmd=select&param='select 
blahblahblah from pippo', la PHP eseguira' la select e ritornera' le righe 
risultanti come risultato (dove "normalmente" ci sarebbe il 
<html>...</html>); la tua applet aprira' l'URL (via URLConnection), 
ricevera' lo stream di risposta e lo interpretera' opportunamente.
Ci sono sicuramente molti esempi in giro di cose come queste. Bruno Bossola 
ha scritto, se non erro, un esempio di push HTTP che (benche' non sia 
esattamente quello che cerchi) probabilmente contiene codice per 
interpretare risultati da una servlet (nel tuo caso, pagina PHP) da 
un'applet.


 un'applet.
Grazie per la risposta, un'ultima domanda: secondo te è fattibile fare una
"select all" su una tabella da 10.000 righe e gestirne efficacemente
l'output in questo modo? Conviene usare xml o Soap o non cambia niente? Cosa
è Soap non lo so bene, so solo che c'entra con xml e web services...

 e web services... 
SOAP definisce una notazione standard per inviare quei comandi e i loro 
parametri e ricevere le relative risposte.


 cento risultati" "dammi i prossimi cento" eccetera.
Mi sembra una cosa comunque poco efficiente con molti dati(in confonto alla
velocità di una query unica), vero?

 alla velocità di una query unica), vero?
Dipende: se i dati sono *tanti*, il tempo per trasmetterli in ogni caso e' 
molto superiore all'overhead del colloquio, quindi l'impatto non e' 
granche'. Chiaramente devi programmare le cose per bene, ad esempio 
evitando copie e replicazioni - e qui puo' essere che una servlet sia 
meglio di una pagina PHP, ma non saprei. Se i dati sono pochi, bisogna 
progettare bene il protocollo in modo che l'overhead per il colloquio sia 
piccolo a sufficienza - il che non e' difficile ammenoche' tu non voglia 
fare cose tipo migliaia di select che restituiscono una riga..



Guarda, grazie mille. Ti farò sapere per quanto riguarda la soluzione che
intraprenderò e per avere altri consigli...
Ciao!

Visto che Cristiano mi ha citato (ciao!) mi infilo per dirti che 
effettivamente tempo fa ho realizzato un sistema di comunicazione 
su HTTP basato su servlet che uso attualmente proprio per fare cose 
del genere. Si chiama GMI e lo trovi sul mio sito a questo URL:
http://digilander.libero.it/bbossola/gmi.html
 
(ci sono anche i sorgenti se mi ricordo bene)
Nell'esempio sul tutorial (sempre online) trovi una comunicazione fra 
applet e sistema remoto, ma non c'e' problema ad usarlo con un client 
di tipo application, non cambia nulla, devi solo indicare esplicitamente
l'URL del servizio remoto.
Comunque effettivamente in Italia e' difficile trovare un hosting che 
ti fornisca servlet, jsp e quanto di solito serve per sviluppare 
applicazione java server side (almeno per ora).
Ciao,
    bruno.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 (ci sono anche i sorgenti se mi ricordo bene)
Grande Bruno! :) Non mi ricordavo i dettagli (acc, un'altro aggiornamento 
della FAQ che e' in coda da mesi :-)


 applicazione java server side (almeno per ora).
Per caso conosci un hosting gratuito con supporto servlet e database per
provare il tutto? Se volessi provare le servlet in locale qual'č il modo piů
semplice per farlo? Su questo pc ho il Sun Studio One CE e Jbuilder 7, devo
installare altro (Tomcat, Jboss... nomi quasi sconosciuti...)? Inoltre ho
Apache...
Grazie!


Non e' strettamente necessario, per sviluppare e' sufficiente Tomcat
Ciao,
    Bruno.
---
| Bruno Bossola 
| A Java Software Engineer :-)
| 
http://digilander.iol.it/bbossola
|
| Membro del JUG Torino - 
http://www.jugtorino.it
|