Autore Topic: client restful web service ?  (Letto 961 volte)

Offline DjWilliams

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    tablet
  • Sistema operativo:
    windows vista
client restful web service ?
« il: 25 Giugno 2013, 23:10:33 CEST »
0
Salve sono un nuovo iscritto e da poco mi sono accostato alla programmazione android.
Avrei bisogno di un vostro suggerimento sulla realizzazione di un client restful.
Come primo approccio sto cercando di creare una connessione tra il web service che gira in locale sul mio PC ed un client che gira su dispositivo android effettuando una semplice operazione di GET.
In pratica il WS mette a disposizione una stringa e il client deve recuperare tale stringa e la deve stampare.
Il web service lo sviluppato con netbeans ( server glassfish ), il client lo sviluppato anche su netbeans ( no come progetto android ) e funziona benissimo, invece quando lo sviluppo su eclipse come progetto android e lo faccio partire sul mio tablet non mi stampa niente (stesso discorso se lo faccio partire sull'emulatore).

Di seguito dettaglierò i codici che ho usato.

Questo è il mio web service restful :

package org.me.jvs_peppe;

import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.PathParam;
import javax.ws.rs.Consumes;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;

@Path("/generic")
public class GenericResource {
   
    private static String stringa = "Hello ! - By RESTful Web Service -";

    @Context
    private UriInfo context;

 
    public GenericResource() {
    }

 
    @GET
    @Produces("application/xml")
    public String getXml() {
                return stringa;
       
    }

Questo è il mio client come semplice applicazione java :

import java.net.*;
import java.io.*;

public class Java_App_Client {
   
    public static void main(String[] args) throws Exception {
try{
        URL url_res = new URL ("http://indirizzoIP:porto/Java_Web_Services/webresources/generic");
        //L'oggetto conn rappresenta la connessione
        HttpURLConnection conn = (HttpURLConnection)url_res.openConnection();
        // impostiamo il metodo della connessione
        conn.setRequestMethod("GET");
        conn.setRequestProperty("Content Type","application/xml");
        conn.setRequestProperty("Accept","text/plain,text/html,application/xml");
        conn.setDoInput(true);
        conn.connect();
       
        int status=conn.getResponseCode();
        System.out.println("RESPONSE CODE: "+status);
       
       
        String str="";
       
        if (status>=200 && status<=299) {
        InputStreamReader in=new InputStreamReader(conn.getInputStream(), "UTF-8");
        //InputStream in=new BufferedInputStream(conn.getInputStream());
        int c;
       
       
        while ((c=in.read())!=-1)
        //System.out.print((char)c);
            str = str + (char)c;
         
        }
       
        System.out.println(str);
       
        conn.disconnect();
        }
        catch (Exception e){}

Questo invece è il client android :

package com.example.clientrest;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;

import java.io.*;
import java.net.*;

public class M_Activity extends Activity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_m_);
      
      
      try{
           URL url_res = new URL ("http://indirizzoIP:porto/Java_Web_Services/webresources/generic");
           //L'oggetto conn rappresenta la connessione
           HttpURLConnection conn = (HttpURLConnection)url_res.openConnection();
           // impostiamo il metodo della connessione
           conn.setRequestMethod("GET");
           conn.setRequestProperty("Content Type","application/xml");
           conn.setRequestProperty("Accept","text/plain,text/html,application/xml");
           conn.setDoInput(true);
           conn.connect();
          
           int status=conn.getResponseCode();
           //System.out.println("RESPONSE CODE: "+status);
          
          
           String str="";
          
           if (status>=200 && status<=299) {
           InputStreamReader in=new InputStreamReader(conn.getInputStream(), "UTF-8");
           //InputStream in=new BufferedInputStream(conn.getInputStream());
           int c;
          
          
           while ((c=in.read())!=-1)
           //System.out.print((char)c);
               str = str + (char)c;
            
           }
          
           //System.out.println(str);
           TextView mess = new TextView(this);
      mess.setText("str");
      setContentView(mess);
          
           conn.disconnect();
           }
           catch (Exception e){}
      
      
   }

Ripeto la stranezza è che il client come progetto java su netbeans funziona, come progetto android invece non funziona!

La consolle di eclipse-android mi fornisce qst errore :

[2013-06-20 14:52:03 - ddmlib] Connessione interrotta dal software del computer host
java.io.IOException: Connessione interrotta dal software del computer host
   at sun.nio.ch.SocketDispatcher.write0(Native Method)
   at sun.nio.ch.SocketDispatcher.write(Unknown Source)
   at sun.nio.ch.IOUtil.writeFromNativeBuffer(Unknown Source)
   at sun.nio.ch.IOUtil.write(Unknown Source)
   at sun.nio.ch.SocketChannelImpl.write(Unknown Source)
   at com.android.ddmlib.JdwpPacket.writeAndConsume(JdwpPacket.java:213)
   at com.android.ddmlib.Client.sendAndConsume(Client.java:607)
   at com.android.ddmlib.HandleHeap.sendREAQ(HandleHeap.java:348)
   at com.android.ddmlib.Client.requestAllocationStatus(Client.java:453)
   at com.android.ddmlib.DeviceMonitor.createClient(DeviceMonitor.java:835)
   at com.android.ddmlib.DeviceMonitor.openClient(DeviceMonitor.java:803)
   at com.android.ddmlib.DeviceMonitor.processIncomingJdwpData(DeviceMonitor.java:763)
   at com.android.ddmlib.DeviceMonitor.deviceClientMonitorLoop(DeviceMonitor.java:652)
   at com.android.ddmlib.DeviceMonitor.access$100(DeviceMonitor.java:44)
   at com.android.ddmlib.DeviceMonitor$3.run(DeviceMonitor.java:580)

Spero di essere stato completo nelle info e spero che riusciate a darmi un suggerimento o uno spunto o anche una alternativa che sia sempre nell'ambito dei restful.


Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:client restful web service ?
« Risposta #1 il: 26 Giugno 2013, 08:21:12 CEST »
0
Il primo errore fondamentale nel client android è che hai messo la connessione all'interno di OnCreate, che viene eseguito all'interno del thread di UI. Regola fondamentale della programmazione su piattaforma Android è non eseguire task onerosi (come le connessioni di rete) all'interno del thread di UI, ma usare thread o asynctask.

E' una domanda che ricorre quasi giornalmente e le risposte sono molto numerose, sia sul forum che in rete, anche nei tutorial di base presenti sul sito developer.android.com .


PS: Per riportare il codice usa i tag appositi per la formattazione , altrimenti è illeggibile.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline DjWilliams

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    tablet
  • Sistema operativo:
    windows vista
Re:client restful web service ?
« Risposta #2 il: 26 Giugno 2013, 21:22:24 CEST »
0
A parte la violazione della "regola fondamentale" il programma non dovrebbe comunque creare la connessione e restituire il risultato desiderato ?
Se il codice lo faccio eseguire in un thread separato, risolvo il problema ?

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:client restful web service ?
« Risposta #3 il: 26 Giugno 2013, 21:29:48 CEST »
0
A parte la violazione della "regola fondamentale" il programma non dovrebbe comunque creare la connessione e restituire il risultato desiderato ?

Non è detto. Da android 4.0 (o forse era il 3.2?) la creazione di connessioni di rete nel main-thread genera automaticamente una eccezione.

Se il codice lo faccio eseguire in un thread separato, risolvo il problema ?

Leggendo al volto il codice incollato mi è molto difficile assicurarti che non ci siano altri problemi, o quali potrebbero essere. Ad esempio sarebbe utile il LogCat (non è quello che hai postato, anche se ha qualche somiglianza), nel quale potrebbe facilmente risultare una NetworkOnMainThreadException.

Io ti consiglio di aprire il pannellino del LogCat (che è lo strumento usato per fare debug su android) e riprodurre il problema, quindi individuare l'exception generata.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline DjWilliams

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    tablet
  • Sistema operativo:
    windows vista
Re:client restful web service ?
« Risposta #4 il: 26 Giugno 2013, 22:15:57 CEST »
0
Ho provato ad aggiungere i permessi nel manifest :
<uses-permission android:name="android.permission.INTERNET"></uses-permission>

Adesso il programma si arresta del tutto ! Nel LogCat compare un FATAL EXCEPTION: main.

Bhe senza dubbio devo cercare di far girare il codice in un thread separato...

Sapresti indicarmi qualche tutorial/manuale/libro sui thread in android e sulle connessioni di rete/restful web service in android ? (in italiano possibilmente ).

Grazie :)


Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:client restful web service ?
« Risposta #5 il: 27 Giugno 2013, 08:38:01 CEST »
0
Adesso il programma si arresta del tutto ! Nel LogCat compare un FATAL EXCEPTION: main.

Il LogCat ti dice anche in quale file e a quale rigo è stata generata l'eccezione, guarda meglio e prendici confidenza, perchè è l'unico strumento per il debug che avrai a disposizione.

Sapresti indicarmi qualche tutorial/manuale/libro sui thread in android e sulle connessioni di rete/restful web service in android ? (in italiano possibilmente ).

Se ti limit all'italiano perdi il 98% delle risorse/manuali/tutorial a disposizione.  ;-)

Prova a vedere se questo mio vecchio tutorial può fare al caso tuo: [facile] HttpBookSearch: AsyncTask, HttpClient, XML parsing, ProgressDialog - Android Developers Italia

EDIT: c'è anche questa interessante libreria che fa un po' tutto da sola. Android Asynchronous Http Client
« Ultima modifica: 27 Giugno 2013, 09:17:15 CEST da bradipao »
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline DjWilliams

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    tablet
  • Sistema operativo:
    windows vista
Re:client restful web service ?
« Risposta #6 il: 27 Giugno 2013, 14:47:50 CEST »
0
Ho dato un occhiata al tuo tutorial e direi che fa proprio al caso mio.

Se conosci altri tutorial su qst genere ,anche in inglese, poi tranquillamente postarli qui ...

Ti ringrazio di tutto ;)