2012-04-01 26 views
14

ich nichts Vergleichbares jedoch eine HTTPS Get Anfrage an den Google Shopping-api senden möchte arbeitet für mich, hier zum Beispiel ist das, was ich im Moment bin versucht:Android - Senden HTTPS GET-Anfrage

try {   
     HttpClient client = new DefaultHttpClient(); 
     HttpGet request = new HttpGet(); 
     request.setURI(new URI("https://www.googleapis.com/shopping/search/v1/public/products/?key={my_key}&country=&q=t-shirts&alt=json&rankByrelevancy=")); 
     HttpResponse response = client.execute(request); 
    } catch (URISyntaxException e) { 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return response; 
}  

Wenn jemand irgendwelche Vorschläge hat, wie man das verbessert oder ersetzt, lass es mich wissen, danke im Voraus.

+1

Das ist nicht Ihren vollständigen Code wie in dem Szenario über dem 'response' Variable ist in ihrem Umfang nicht der return-Anweisung. Das heißt, Sie deklarieren es in Ihrem try-Block, so dass es einfach nicht funktionieren würde. Was läuft falsch? – Blundell

+0

Ich habe meinen Beitrag bearbeitet, um die Test-Klammer aufzunehmen, aber das ist es. Sollte ich die try und catch Klammern entfernen und einfach die "throws exception ..." verwenden, damit ich auf die Antwortvariable zugreifen kann? –

+2

Was funktioniert nicht? Jede Ausnahme, Logcat? Wenn das Problem von httpClient kam, ist das erste, was ich tun sollte, die Überprüfung des Antwortstatuscodes, z. B. httpResponse.getStatusLine(). GetStatusCode(); – yorkw

Antwort

38

Sie sollten einen Kompilierungsfehler bekommen.

Dies ist die korrekte Version:

HttpResponse response = null; 
try {   
     HttpClient client = new DefaultHttpClient(); 
     HttpGet request = new HttpGet(); 
     request.setURI(new URI("https://www.googleapis.com/shopping/search/v1/public/products/?key={my_key}&country=&q=t-shirts&alt=json&rankByrelevancy=")); 
     response = client.execute(request); 
    } catch (URISyntaxException e) { 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return response; 
} 

daher jetzt, wenn Sie einen Fehler Ihrer Antwort haben wird als null zurückgeführt werden.

Sobald Sie die Antwort haben und auf null überprüft haben, wollen Sie den Inhalt (d. H. Ihre JSON) erhalten.

http://developer.android.com/reference/org/apache/http/HttpResponse.html http://developer.android.com/reference/org/apache/http/HttpEntity.html http://developer.android.com/reference/java/io/InputStream.html

response.getEntity().getContent(); 

Dies gibt Ihnen einen Inputstream, mit zu arbeiten. Wenn Sie diese in einen String konvertieren möchten würden Sie das unten stehende oder gleichwertig tun:

http://www.mkyong.com/java/how-to-convert-inputstream-to-string-in-java/

public static String convertStreamToString(InputStream inputStream) throws IOException { 
     if (inputStream != null) { 
      Writer writer = new StringWriter(); 

      char[] buffer = new char[1024]; 
      try { 
       Reader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"),1024); 
       int n; 
       while ((n = reader.read(buffer)) != -1) { 
        writer.write(buffer, 0, n); 
       } 
      } finally { 
       inputStream.close(); 
      } 
      return writer.toString(); 
     } else { 
      return ""; 
     } 
    } 

Wenn Sie diese Zeichenfolge haben benötigen Sie einen JSONObject davon zu erstellen:

http://developer.android.com/reference/org/json/JSONObject.html

JSONObject json = new JSONObject(inputStreamAsString); 

Fertig!

+0

Arbeitete einwandfrei, ich kann Ihnen nicht genug danken! –

+0

Nicht für mich arbeiten? SSLPeerUnspicifiedException tritt auf :( –

6

Haben Sie fügen Sie diese zu Ihrem Manifest

<uses-permission android:name="android.permission.INTERNET" /> 
+0

Ja, ich habe, danke, obwohl. –

0

Es ist schwer, sicher zu sagen, wenn Sie uns nicht sagen, was der Fehler ist.

Wenn Sie dies jedoch auf dem Benutzeroberflächen-Thread ausführen und der Webserver mehr als ein paar Sekunden benötigt, um eine Antwort zu erhalten, erhalten Sie vom System eine Warnung "Anwendung reagiert nicht". Stellen Sie sicher, dass Sie Netzwerkübertragungen in einem separaten Thread durchführen.

3

Sie können es versuchen, auf diese Weise vielleicht URLConnection Klasse

String error = ""; // string field 
private String getDataFromUrl(String demoIdUrl) { 

    String result = null; 
    int resCode; 
    InputStream in; 
    try { 
     URL url = new URL(demoIdUrl); 
     URLConnection urlConn = url.openConnection(); 

     HttpsURLConnection httpsConn = (HttpsURLConnection) urlConn; 
     httpsConn.setAllowUserInteraction(false); 
     httpsConn.setInstanceFollowRedirects(true); 
     httpsConn.setRequestMethod("GET"); 
     httpsConn.connect(); 
     resCode = httpsConn.getResponseCode(); 

     if (resCode == HttpURLConnection.HTTP_OK) { 
      in = httpsConn.getInputStream(); 

      BufferedReader reader = new BufferedReader(new InputStreamReader(
        in, "iso-8859-1"), 8); 
      StringBuilder sb = new StringBuilder(); 
      String line; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line).append("\n"); 
      } 
      in.close(); 
      result = sb.toString(); 
     } else { 
      error += resCode; 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return result; 
} 
+0

java.lang.ClassCastException: com.android.okhttp.internal.http.HttpURLConnectionImpl kann nicht in javax.net.ssl.HttpsURLConnection umgewandelt werden – beetree

+0

Oh wow, fail. Ich habe versucht, eine "http" URL anzufordern. Sehr gut ... – beetree

+0

Wenn ich "HttpURLConnection" anstelle von "HttpsURLConnection" in diesem Code verwende, was wird der Unterschied sein? Da "HttpsURLConnection" von "HttpURLConnection" erbt, werden die gleichen Methoden von der gleichen Instanz aufgerufen ". connect "und" .getInputStream ". Bin ich falsch? –