Autore Topic: AndroidHttpClient non ritorna quello che mi aspetto  (Letto 368 volte)

Offline arlabs

  • Utente normale
  • ***
  • Post: 434
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS7
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
AndroidHttpClient non ritorna quello che mi aspetto
« il: 22 Gennaio 2015, 19:22:37 CET »
0
Innanzitutto il codice, ne metto un ritaglio che dovrebbe essere sufficente.
Premetto che l'ho usato in modo simile altre volte senza problemi... quindi c'è qualcosa di strano.

All'interno di un AsyncTask faccio la chiamata
Codice (Java): [Seleziona]
        protected PromotedApps doInBackground(String... packageNames)
        {
            String packageName = packageNames[0];

            PromotedApps apps = null;
            final String queryUrlFormat = mContext.getResources().getString(R.string.db_promoquery_url);
            final String queryUrl = String.format( (Locale)null, queryUrlFormat, packageName );

            HttpGet request = new HttpGet(queryUrl);
            int count = 0;
            do {
                try
                {
                    apps = mHttpClient.execute(request, mPromotedAppsResponseHandler);
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            } while( (apps == null) && (++count < 3) );

            return apps;
        }

La stringa queryUrl vale (verificato) "http://www.arlabs-mobile.com/app_promo_query.php/?package=com.arlabsmobile.altimeter"
I link funziona correttamente nel browser (provare per credere)

In realtà nel response handler, di cui accenno le prime righe qui, in cui copio la risposta,
Codice (Java): [Seleziona]
        @Override public PromotedApps handleResponse(HttpResponse httpResponse) throws ClientProtocolException, IOException
        {
            PromotedApps promotedApps = null;

            InputStream content = httpResponse.getEntity().getContent();
            byte[] buffer = new byte[1024];
            int numRead = 0;
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            while((numRead=content.read(buffer))!=-1)
            {
                baos.write(buffer, 0, numRead);
            }
            ...

ottengo un errore dal server, qui il link ad una copia di ciò che ottengo: http://www.arlabs-mobile.com/error.html

Nei Logcat non c'è nulla di significativo.

La stringa dell'URL usata l'ho verificata più volte, tanto che nell'errore è riportata correttamente. Ho provato a fare copia e incolla della stringa riportata nell'errore nel browser e funziona.
C'è qualcosa di fondo che mi sfugge.

Qualcuno mi può essere d'aiuto?

Ciao.

Post unito: 23 Gennaio 2015, 16:22:11 CET
Nessuno mi sa essere di aiuto?

Ho cercato online, ma non ho trovato la causa.

Ho provato a sostituire l'uso di AndroidHttpClient con l'uso di HttpURLConnection.

Codice (Java): [Seleziona]
            HttpURLConnection urlConnection = null;
            try
            {
                URL url = new URL(queryUrl);
                urlConnection = (HttpURLConnection) url.openConnection();

                InputStream in = new BufferedInputStream(urlConnection.getInputStream());
                String jsonString = FileUtils.readStream(in);
                apps = parseJson( jsonString );
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            finally {
                if( urlConnection != null )
                    urlConnection.disconnect();
            }

Questo codice invece funziona correttamente con lo stesso identico URL. Lo script PHP non l'ho toccato...
Vorrei veramente cercare di capire cosa c'era che non andava prima.
Non ho conoscenze approfondite sull'argomento e probabilmente la spiegazione rientra in qualche piega di quello che non so. Capira il perché non funzionava mi aiuterebbe a capire un po' meglio l'HttpClient.

A riguardo volevo porre una domana, la pongo qui, ma forse starebbe meglio in un nuovo thread.

Quale è la differenza fra AndroidHttpClient e HttpURLConnection?

Qui (http://android-developers.blogspot.it/2011/09/androids-http-clients.html) nel 2011 veniva consigliato di usare HttpURLConnection. In realtà nella maggior parte degli esempi ho sempre trovato l'uso di AndroidHttpClient ed io ho sempre usato quello.
AndroidHttpClient di solito se ne istanzia uno e può essere usato concorrentemente in diversi thread con diverse request.
HttpURLConnection si istanzia ad ogni request? E' questa il modo corretto di usarlo? Immagino che non ci siano problemi ad usarlo concorrentemente.

Voi cosa usate?

Ciao.
« Ultima modifica: 23 Gennaio 2015, 16:22:12 CET da arlabs, Reason: Merged DoublePost »