2012-04-01 36 views
14

Tôi muốn gửi một HTTPS Nhận Yêu cầu các api mua sắm google tuy nhiên không có gì là khá làm việc cho tôi, ví dụ ở đây là những gì tôi đang cố gắng vào lúc này:Android - Gửi HTTPS Nhận Yêu cầu

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; 
}  

Nếu có ai có bất kỳ đề xuất nào về cách cải thiện hoặc thay thế nó, vui lòng cho tôi biết, cảm ơn trước.

+1

Thats không mã đầy đủ của bạn như trong kịch bản trên biến 'response' không nằm trong phạm vi của lệnh return. tức là bạn khai báo nó trong khối thử để không hoạt động. Có chuyện gì vậy? – Blundell

+0

Tôi đã chỉnh sửa bài đăng của mình để bao gồm khung thử, nhưng đó là nó. Tôi có nên loại bỏ các dấu ngoặc cố gắng và bắt và chỉ sử dụng 'ném ngoại lệ ...' để tôi có thể truy cập biến trả lời không? –

+2

Điều gì không hiệu quả? Có ngoại lệ nào không, Logcat? Khi sự cố đến từ httpClient, điều đầu tiên tôi khuyên bạn nên luôn kiểm tra mã trạng thái phản hồi tức là httpResponse.getStatusLine(). GetStatusCode(); – yorkw

Trả lời

38

Bạn sẽ nhận được lỗi biên dịch.

Đây là phiên bản chính xác:

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; 
} 

Vì vậy bây giờ nếu bạn có một lỗi phản ứng của bạn sẽ được trả lại như null.

Khi bạn có phản hồi và đã kiểm tra nó cho giá trị rỗng, bạn sẽ muốn lấy nội dung (tức là JSON của bạn).

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(); 

này mang đến cho bạn một InputStream để làm việc với. Nếu bạn muốn chuyển đổi này thành một chuỗi bạn muốn làm dưới đây hoặc tương đương:

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 ""; 
     } 
    } 

Khi bạn có chuỗi này bạn cần phải tạo ra một JSONObject từ nó:

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

JSONObject json = new JSONObject(inputStreamAsString); 

Xong!

+0

Làm việc hoàn hảo, không thể cảm ơn đủ! –

+0

Không hoạt động với tôi? SSLPeerUnspicifiedException occure :( –

6

Bạn có thêm video này vào manifest

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

Có, tôi cảm ơn. –

0

Thật khó để nói chắc chắn nếu bạn không cho chúng tôi biết lỗi này là của bạn.

Nhưng nếu bạn đang chạy ứng dụng này trên chuỗi giao diện người dùng và máy chủ web mất hơn một vài giây để trả lời, bạn sẽ nhận được cảnh báo Ứng dụng không phản hồi từ hệ thống. Đảm bảo rằng bạn thực hiện bất kỳ chuyển mạng nào trên một chuỗi riêng biệt.

3

Bạn có thể thử theo cách này có thể sử dụng lớp URLConnection

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 không thể được truyền tới javax.net.ssl.HttpsURLConnection – beetree

+0

Ồ wow, thất bại.Tôi đã cố gắng yêu cầu một địa chỉ "http". Rất tốt ... – beetree

+0

Nếu tôi sử dụng 'HttpURLConnection' thay vì' HttpsURLConnection' trong mã này, điều gì sẽ là sự khác biệt? Khi 'HttpsURLConnection' kế thừa từ' HttpURLConnection', các phương thức tương tự từ cùng một cá thể sẽ được gọi trên '. connect' và '.getInputStream' Tôi có sai không? –

Các vấn đề liên quan