Gestire response da servlet

di il
3 risposte

Gestire response da servlet

Salve a tutti,
Il mio problema è il seguente:
Ho un app android che invia una richiesta GET a una servlet java la quale gira su TomCat. Vorrei in particolare che la servlet generasse in risposta una pagina web statica da visualizzare nell'app.

Il codice che ho utilizzato per inviare la GET è il seguente:

try {
                                        HttpClient client = new DefaultHttpClient(); 
                                        URI getURL = new URI("http://192.168.1.100:8080/MyServlet?param1="+param1+"&param2="+param2);
                                        Log.i("QUERY",getURL.getQuery());
                                        HttpGet get = new HttpGet(getURL);
                                        HttpResponse responseGet = client.execute(get);  
                                        HttpEntity resEntityGet = responseGet.getEntity();  
                                        if (resEntityGet != null) {  
                                                    Log.i("GET RESPONSE",EntityUtils.toString(resEntityGet));
                                                }
                                        
                                        } catch (Exception e) {
                                            e.printStackTrace();
                                        }
Ho fatto bene?
Se si, come posso ora gestire la response in modo da ottenere quello che cerco?

Grazie a tutti anticipatamente.

3 Risposte

  • Re: Gestire response da servlet

    Ciao, la richiesta di per sé è fatta bene, però considera che di base la classe HttpClient non sfrutta un altro thread, per cui se non te ne sei occupato tu personalmente allora tutta questa trafila viene eseguita sul main thread, col risultato che android si lamenterà (se lavori con una versione abbastanza recente ti dovrebbe crashare tutto quanto in seguito ad una NetworkOnMainThreadException). La soluzione, quindi, è quella di effettuare la richiesta su un nuovo thread (ad esempio estendendo la classe AsyncTask).

    Per quanto riguarda la gestione della risposta, una volta che tu ottieni la "resEntityGet" sei praticamente a posto: essa contiene la risposta alla tua richiesta, risposta che puoi ottenere sotto forma di stringa tramite il metodo EntityUtils.toString(resEntityGet) (come hai già fatto, fra l'altro), dopodiché puoi farci quello che ti pare (es: visualizzarlo su una webview)
  • Re: Gestire response da servlet

    Questa è la mia classe per intera, dove ho usato l'AsincThread:
    La richiesta è all'interno del metodo doInBackground() praticamente, purtroppo ho dei problemi con il server per cui non posso testare se funzioni effettivamente, per questo chiedo.
    protected String doInBackground(Void... params) {
    			return uploadFile();
    		}
    
    
    private String uploadFile() {
    			String responseString = null;
    
    			HttpClient httpclient = new DefaultHttpClient();
    			HttpPost httppost = new HttpPost(Config.FILE_UPLOAD_URL);
    
    			try {
    				AndroidMultiPartEntity entity = new AndroidMultiPartEntity(
    						new ProgressListener() {
    
    							@Override
    							public void transferred(long num) {
    								publishProgress((int) ((num / (float) totalSize) * 100));
    							}
    						});
    
    				File sourceFile = new File(filePath);
    
    				// Adding file data to http body
    				entity.addPart("image", new FileBody(sourceFile));
    
    				
    				totalSize = entity.getContentLength();
    				httppost.setEntity(entity);
    
    				// Making server call
    				HttpResponse response = httpclient.execute(httppost);
    				HttpEntity r_entity = response.getEntity();
    
    				int statusCode = response.getStatusLine().getStatusCode();
    				if (statusCode == 200) {
    					// Server response
    					responseString = EntityUtils.toString(r_entity);
    					
    					
    					try {
    				        HttpClient client = new DefaultHttpClient();  
    				        URI getURL = new URI("http://x.y.k.z:8080/MyServlet?collection="+collection+"&name="+filename);
    				        Log.i("QUERY",getURL.getQuery());
    				        HttpGet get = new HttpGet(getURL);
    				        HttpResponse responseGet = client.execute(get);  
    				        HttpEntity resEntityGet = responseGet.getEntity();  
    				        if (resEntityGet != null) {  
    				                    Log.i("GET RESPONSE",EntityUtils.toString(resEntityGet));
    				                }
    				        String responseStr = EntityUtils.toString(responseGet.getEntity());
    				        
    					} catch (Exception e) {
    					    e.printStackTrace();
    					}
    					
    				} else {
    					responseString = "Error occurred! Http Status Code: "
    							+ statusCode;
    				}
    
    			} catch (ClientProtocolException e) {
    				responseString = e.toString();
    			} catch (IOException e) {
    				responseString = e.toString();
    			}
    
    			return responseString;
    
    		}
    
    		@Override
    		protected void onPostExecute(String result) {
    			Log.e(TAG, "Response from server: " + result);
    			
    			// showing the server response in an alert dialog
    			showAlert(result);
    			
    			
    			super.onPostExecute(result);
    		}
    
    
    Per quanto riguarda la risposta il punto è che la pagina web generata dev'essere dinamica sulla base dell'elaborazione della servlet.
    Mi spiego meglio:

    a seconda del risultato dell'elaborazione della servlet può essere visualizzata una pagina statica oppure una pagina con elementi provenienti da un interrogazione a un db.
    Avevo pensato di poter generare questa pagina tramite jsp, ma mi sfugge come poter fare le cose contemporaneamente, ovvero generare dinamicamente la pagina tramite la servlet e poi visualizzare questa particolare versione tramite android. Se potessi illustrarmi un po di codice della servlet te ne sarei grato.

    Ti ringrazio per la pazienza
  • Re: Gestire response da servlet

    Dal punto di vista dell'app android è indifferente quello che succede lato server: cioè alla tua app non importa di come venga effettivamente creata la risposta, l'importante è che essa arrivi. Poi se la pagina html è statica oppure è stata generata dinamicamente non cambia nulla: potenzialmente potresti anche non saperlo (se io ti invio del codice HTML non è detto che tu possa dirmi se io l'ho generato staticamente o dinamicamente), e la tua app funzionerebbe comunque.

    Per quanto riguarda la generazione della pagina lato server, invece, si tratta di una questione completamente diversa, per cui se hai dubbi ti consiglio di pubblicare sulla sezione Java (se hai intenzione di usare le servlet) o, ad esempio, sulla sezione di PHP in modo da ricevere un aiuto più specifico e non andare off topic.
Devi accedere o registrarti per scrivere nel forum
3 risposte