如何使用HTTPS和HTTP来解析Android中的JSON数据?

时间:2016-03-19 05:21:45

标签: android json http https

我跟随this到Parse Json在Android

我已成功完成 HttpData处理程序 ..

这里我成功将数据发布到服务器并获得响应..

现在我想在 HTTPS ..

的部分中使用它

任何人都可以建议我如何在我的代码中没有重大更改的情况下执行此操作..因为在我的应用程序中我正在执行此操作以进行更多活动..请建议我在我的代码中使用 HTTPs

我将提供附加信息......取决于响应......

更新 在我的代码中,我将HttpURLConnection更改为HttpsURLConnection

请建议我如何通过此错误在我的代码..

更新1

我在服务器端更改了证书..现在它正在使用Https ..

但现在,

我想在一个应用程序中使用HTTP和HTTPS两者取决于客户端要求现在这里它可以使用Https ....

但我也需要和Http合作 在我的代码中可以任何人建议我...我希望我应该在一个应用程序中使用Https和Http。

5 个答案:

答案 0 :(得分:3)

要同时使用HTTP和HTTPS,您需要拥有2种方法(我认为您已经拥有它们)

  1. GetHTTPData(String urlString)
  2. GetHTTPSData(String urlString)
  3. 现在在HTTPDataHandler类中(上面有两种方法) 你需要创建第3个方法GetDataFromUrl(),它将检查URL并决定使用哪种方法(http或https)

    public String GetDataFromUrl(String url){
        if(url.toLowerCase().startsWith("https")){
            //HTTPS:
            return GetHTTPSData(url);
        }else{
            //HTTP:
            return GetHTTPData(url);
        }
    }
    

    现在在AsyncTask类ProcessJSON

    替换此行stream = hh.GetHTTPData(urlString);

    使用此stream = hh.GetDataFromUrl(urlString);

    如果您不想在HTTPDataHandler中添加第3种方法,只需使用位于if-statement的{​​{1}}中的ProcessJSON来调用其中一种方法( http或https)

答案 1 :(得分:1)

您可以使用HttpsURLConnection,通过HttpsURLConnection替换HttpURLConnection。

   public String GetHTTPData(String urlString){
        try{
            URL url = new URL(urlString);
            HttpsURLConnection urlConnection =(HttpsURLConnection)url.openConnection();

            // Check the connection status
            if(urlConnection.getResponseCode() == 200)
            {
                // if response code = 200 ok
                InputStream in = new BufferedInputStream(urlConnection.getInputStream());

                // Read the BufferedInputStream
                BufferedReader r = new BufferedReader(new InputStreamReader(in));
                StringBuilder sb = new StringBuilder();
                String line;
                while ((line = r.readLine()) != null) {
                    sb.append(line);
                }
                stream = sb.toString();
                // End reading...............

                // Disconnect the HttpURLConnection
                urlConnection.disconnect();
            }
            else
            {
                // Do something
            }
        }catch (MalformedURLException e){
            e.printStackTrace();
        }catch(IOException e){
            e.printStackTrace();
        }finally {

        }
        // Return the data from specified url
        return stream;
    }

答案 2 :(得分:1)

据我所知,在您的服务器端,他们使用自签名SSL证书。所以你必须在你的Android设备上安装该证书。设置>安全>安装表单存储。但是对于生产版本,您必须从CA当局购买ssl证书。 希望这能解决你的问题。

答案 3 :(得分:1)

我有同样的问题,所以我使用了这段代码

// always verify the host - dont check for certificate
 final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier()
 {
    public boolean verify(String hostname, SSLSession session)
    {
        return true;
    }
 };

 /**
  * Trust every server - dont check for any certificate
  */
 @SuppressLint("TrulyRandom")
 private static void trustAllHosts()
 {
    // Create a trust manager that does not validate certificate chains
    TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager()
    {
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return new java.security.cert.X509Certificate[] {};
        }

        public void checkClientTrusted(X509Certificate[] chain,
                String authType) throws CertificateException {
        }

        public void checkServerTrusted(X509Certificate[] chain,
                String authType) throws CertificateException {
        }
    } };

    // Install the all-trusting trust manager
    try {
        SSLContext sc = SSLContext.getInstance("TLS");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    } catch (Exception e) {
        e.printStackTrace();
    }
 }

根据您的要求更新了代码。

 public String postData(String urlString) throws JSONException, IOException
 {
     String result = "";
     try
        {

        HttpURLConnection http = null;
        URL url = new URL(urlString);

        if (url.getProtocol().toLowerCase().equals("https"))
        {
            trustAllHosts();
            HttpsURLConnection https = (HttpsURLConnection) url.openConnection();
            https.setHostnameVerifier(DO_NOT_VERIFY);
            http = https;
        }
        else {
            http = (HttpURLConnection) url.openConnection();
        }
        Log.i("getDate", "="+http.getDate());
        http.connect();
        result = convertStreamToString((InputStream)http.getContent());
        Log.i("tag", "="+result);
        return result;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}
static String convertStreamToString(java.io.InputStream is)
{
    java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
    return s.hasNext() ? s.next() : "";
}

替换此行stream = hh.GetHTTPData(urlString);

使用这一个stream = postData(urlString);

答案 4 :(得分:1)

删除doInBackground中的HttpDataHandler行直接在doInBackground中使用HttpUrlConnection或使用JSONparse类中的HttpUrlConnection将params发布到服务器按照本教程发布params Website