通过HttpClinet类用get方法获得远程接口返回的Json串

本文展示了如何利用HttpClient发送GET请求至淘宝商品搜索API,获取并解析搜索关键词'牛奶'的商品推荐列表,最终输出搜索结果的JSON字符串。



public class HttpClientUtil {
    public static String requestByGetMethod(String s) {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        StringBuilder entityStringBuilder = null;
        try {
            HttpGet get = new HttpGet(s);
            CloseableHttpResponse httpResponse = null;
            httpResponse = httpClient.execute(get);
            try {
                HttpEntity entity = httpResponse.getEntity();
                entityStringBuilder = new StringBuilder();
                if (null != entity) {
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(), "UTF-8"), 8 * 1024);
                    String line = null;
                    while ((line = bufferedReader.readLine()) != null) {
                        entityStringBuilder.append(line + "/n");
                    }
                }
            } finally {
                httpResponse.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (httpClient != null) {
                    httpClient.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return entityStringBuilder.toString();
    }
}



public class TestUrl {
    public static void main(String args[]) {
        String url = "http://suggest.taobao.com/sug?code=utf-8&q=牛奶&callback=cb";
        String res = null;
        try {
            res = HttpClientUtil.requestByGetMethod(url);
            JSONObject result = new JSONObject();
            System.out.println(res);
            res = res.substring(res.indexOf("{"), res.indexOf("}") + 1);
            System.out.println(res);
            result = JSONObject.fromObject(res);
            String token = result.getString("result");
            System.out.println(token);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


用淘宝的商品搜索接口搜索“牛奶”的运行结果:

[["牛奶杯","194640"],["牛奶棉","61327"],["牛奶棉毛线","12855"],["牛奶洗面奶","10614"],["牛奶粉","236940"],["牛奶糖","49320"],["牛奶片","56362"],["牛奶1l","11292"],["牛奶棉线","7820"],["牛奶 1212","1600"]]

### 可能的原因 当调用第三方API时遇到SSL证书验证失败的问题,这通常是由于源应用程序所在的JVM信任库中不存在目标服务器的证书或其完整的证书链所引起的[^3]。 ### 解决方案概述 针对这一问题存在多种解决方案,具体取决于使用的HTTP客户端以及安全需求。以下是几种常见的处理方式: #### 方法一:导入有效的CA根证书至Java的信任存储 如果问题是因缺少特定的CA签发的有效证书,则最正规的做法是从官方渠道获取正确的CA根证书并将其安装到运行环境中的`cacerts`文件里。对于基于Java的应用来说,这意味着更新JRE/JDK自带的信任库。 #### 方法二:禁用SSL验证(仅限测试) 虽然这种方法简单直接,但在生产环境下强烈不建议这样做,因为这样会使通信变得不再安全。然而,在某些情况下为了快速定位其他潜在问题或者是在受控环境中进行临时性的调试工作,可以通过修改HttpClinet、Feign Client 或 OkHttpClient 配置来跳过SSL握手过程中的身份校验步骤[^4]。 对于Feign Client而言,可以在启动参数中加入如下配置项以关闭默认的安全检查机制[^1]: ```properties feign.httpclient.disableSslValidation=true ``` 而对于OkHttpClient则需编程实现自定义的`X509TrustManager` 和 `HostnameVerifier`, 并应用到实例构建器上: ```java import javax.net.ssl.*; ... // 创建一个接受所有证书的信任管理器 final TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { @Override public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {} @Override public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {} @Override public java.security.cert.X509Certificate[] getAcceptedIssuers() {return null;} } }; try { SSLContext sc = SSLContext.getInstance("TLS"); sc.init(null, trustAllCerts, new java.security.SecureRandom()); // 使用上述上下文创建 SSLSocketFactory 实例 final SSLSocketFactory sslSocketFactory = sc.getSocketFactory(); client = new OkHttpClient.Builder() .sslSocketFactory(sslSocketFactory, (X509TrustManager)trustAllCerts[0]) .hostnameVerifier((hostname, session) -> true) .build(); } catch (Exception e){ throw new RuntimeException(e); } ``` 请注意这种方式极大地削弱了HTTPS协议所提供的安全保障功能,因此只应在绝对必要的情况下谨慎采用,并尽快恢复正常的认证流程。 #### 方法三:利用 mkcert 工具生成本地可信证书 在开发阶段或是内部网络部署服务时,可以考虑使用像[mkcert](https://github.com/FiloSottile/mkcert)[^5]这样的工具来自动生成被操作系统认可的SSL/TLS证书。这些证书适用于localhost和其他任意指定域名,非常适合用于模拟真实世界的HTTPS交互而不必担心SSL警告信息干扰正常业务逻辑测试。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值