【问题标题】:Http GET method to Https?Http GET方法到Https?
【发布时间】:2016-08-08 03:26:27
【问题描述】:

对不起,我的菜鸟问题,但我有这段代码可以从我的网络服务中获取有关我的数据库的 JSON 信息:

public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException {
    InputStream is = new URL(url).openStream();
    try  {
        BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
        String jsonText = readAll(rd);
        return new JSONObject(jsonText);
    } finally {
        is.close();
    }
}

private static String readAll(Reader rd) throws IOException {
    StringBuilder sb = new StringBuilder();
    int cp;
    while ((cp = rd.read()) != -1) {
        sb.append((char) cp);
    }
    return sb.toString();
}

我刚刚购买了 SSL 证书,我必须将我的 GET 方法代码从 HTTP 传递到 HTTPS,我该怎么做?

这是我启用 TLS 1.1 和 1.2 的 TLSSocketFactory:

public class TLSSocketFactory extends SSLSocketFactory {

private SSLSocketFactory internalSSLSocketFactory;

public TLSSocketFactory() throws KeyManagementException, NoSuchAlgorithmException {
    SSLContext context = SSLContext.getInstance("TLS");
    context.init(null, null, null);
    internalSSLSocketFactory = context.getSocketFactory();
}

@Override
public String[] getDefaultCipherSuites() {
    return internalSSLSocketFactory.getDefaultCipherSuites();
}

@Override
public String[] getSupportedCipherSuites() {
    return internalSSLSocketFactory.getSupportedCipherSuites();
}

@Override
public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
    return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose));
}

@Override
public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
    return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
}

@Override
public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {
    return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port, localHost, localPort));
}

@Override
public Socket createSocket(InetAddress host, int port) throws IOException {
    return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
}

@Override
public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
    return enableTLSOnSocket(internalSSLSocketFactory.createSocket(address, port, localAddress, localPort));
}

private Socket enableTLSOnSocket(Socket socket) {
    if(socket != null && (socket instanceof SSLSocket)) {
        ((SSLSocket)socket).setEnabledProtocols(new String[] {"TLSv1.1", "TLSv1.2"});
    }
    return socket;
}
}

使用我的 POST 方法,我创建了一个我的 TLSSocket 工厂的实例,并将其应用于我的 POST 方法,如下所示:

TLSSocketFactory tlsSocketFactory = new TLSSocketFactory();
        HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
        conn.setSSLSocketFactory(tlsSocketFactory);

但是,我的问题是.. 我怎样才能为我的 GET 方法做同样的事情?

谢谢你帮助我!

【问题讨论】:

    标签: json web-services ssl android-studio https


    【解决方案1】:

    要将您的TLSSocketFactory 设置为使用给定您的url假设它是一个HTTPS URL,您可以使用:

    HttpsURLConnection conn = (HttpsURLConnection) new URL(url).openConnection();
    conn.setSSLSocketFactory(tlsSocketFactory);
    

    就像你对POSTPUT所做的一样。要明确声明您希望此 conn 使用 GET

    conn.setRequestMethod("GET");
    

    "POST""PUT" 根据需要。那么:

    conn.connect();
    InputStream is = conn.getInputStream();
    

    并从 InputStream 读取您的 JSON 数据。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2016-04-15
      • 2017-03-16
      • 2020-12-02
      • 2019-02-23
      • 2012-04-23
      • 2018-11-07
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      相关资源
      最近更新 更多