Https 带证书post请求方法 亲测可用

 

测试代码 Https带证书请求方法敬上,根据业务可能会适当更改传参方式或请求方式

 

@GetMapping(value = "loginSubmit")
    public ApiResult loginSubmit(){
        try {
            long timeStamp = System.currentTimeMillis();
            JSONObject data = new JSONObject();
            String miwen = RSASecureUtil.encrypt("{\"mobile\": \"18954119383\",\"oauthid\": \"18954119383\",\"idno\": \"370125199512297023\",\"name\": \"张三\",\"timeStamp\":"+timeStamp+",\"regdate\":1563743945616}", AppConfig.REG_PUBLICKEY);
            data.put("reqData",miwen);

            System.out.println("data ZString:==="+ data.toString());
            String result = HttpsSSL.postMap1(AppConfig.USER_REG_URL,data.toJSONString());
            JSONObject jsonObject = JSON.parseObject(result);
            return new ApiResult().success(jsonObject);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }


    /**
     * @Date 2019/6/20 16:48
     **/
    @GetMapping(value = "loginSubmit1")
    public String loginSubmit1(){
        try {
//            Map<String, String> data = new HashMap<>();
            JSONObject data = new JSONObject();
            long timeStamp = System.currentTimeMillis();
            String miwen = RSASecureUtil.encrypt("{\"mobile\":             \"18954119383\",\"oauthid\": \"18954119383\",\"idno\": \"370125199512297023\",\"name\": \"张三\",\"timeStamp\":"+timeStamp+",\"regdate\":1563743945616}",
 AppConfig.REG_PUBLICKEY);
//            String miwen = RSASecureUtil.encrypt("{\"uuid\": \"370125199511297023\",\"timeStamp\":\""+timeStamp+"\"}", AppConfig.REG_PUBLICKEY);
            data.put("reqData",miwen);

            String ss = data.toJSONString();
            System.out.println("ss:"+ ss);
            //加密请求头
//            Map<String,String> httpHeaders = new HashMap<>();
//            httpHeaders.put("Content-Type","application/json");
            System.out.println("请求开始:============" );
            String result = HttpsSSL.sendPostAndReturn(ss, AppConfig.USER_REG_URL);
            System.out.println("请求结果:" +result);
            return result;
        } catch (Exception e) {
            System.out.println("请求异常" + e.getMessage());
            e.printStackTrace();
            return null;
        }
    }
 public static String postMap1(String url, String params) throws Exception {
        logger.info("省厅的url=========" + url);
        logger.info("省厅的请求体=========" + JSONObject.toJSONString(params));
        String result = null;
        KeyStore keyStore = KeyStore.getInstance("PKCS12");
        InputStream instream = new FileInputStream(new File(AppConfig.PFX_PATH));
        logger.info("证书:" + instream);
        try {
            logger.info("====================2====================");
            keyStore.load(instream, AppConfig.PFX_PWD.toCharArray());
        } finally {
            instream.close();
        }
        logger.info("====================3====================");
        SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, AppConfig.PFX_PWD.toCharArray()).build();
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext
                , new String[]{"TLSv1"}    // supportedProtocols ,这里可以按需要设置
                , null    // supportedCipherSuites
                , SSLConnectionSocketFactory.getDefaultHostnameVerifier());
        logger.info("====================4====================");
        CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
        HttpPost post = new HttpPost(url);

        logger.info("====================6====================");
        CloseableHttpResponse response = null;
        try {
            post.addHeader("Content-Type","application/json");
//            if (content.size() > 0) {
//                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(content, "UTF-8");
//                post.setEntity(entity);
//            }
            StringEntity requestEntity = new StringEntity(params,"utf-8");
            post.setEntity(requestEntity);
            //发送请求并接收返回数据
            response = httpClient.execute(post);
            logger.info("返回果为:+++++++++" + JSONObject.toJSONString(response));
            System.out.println(response);


            try {
                HttpEntity  entity = response.getEntity();
                result  = EntityUtils.toString(entity,"utf-8");
                EntityUtils.consume(entity);
                logger.error("returnData=:{}",result);
            } catch (Exception e) {
                logger.error("catch");
            }finally{
                response.close();
            }
            logger.info("请求结果为:+++++++++" + result);
            System.out.println(result);
            return result;
        } catch (UnsupportedEncodingException e) {
            logger.info("请求异常222");
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            logger.info("===================7===================");
            e.printStackTrace();
        } catch (IOException e) {
            logger.info("====================8====================");
            e.printStackTrace();
        } finally {
            try {
                httpClient.close();
                if (response != null) {
                    response.close();
                }
            } catch (IOException e) {
                logger.info("====================9====================");
                e.printStackTrace();
            }

        }
        return null;
    }

    /**
     * HTTPClient ssl认证 发送post请求
     * @param params
     * @param url
     * @return
     */
    public static String sendPostAndReturn(String params, String url) {

        String returnData = "";
        try {
            KeyStore trustStore = KeyStore.getInstance("PKCS12");
            //main方法测试时把这里打开
//            InputStream intream = ClassLoader.getSystemResourceAsStream("client.p12");
            //正式环境部署时打开下面
              InputStream intream = new FileInputStream(new File(AppConfig.PFX_PATH));
            try {

                trustStore.load(intream, AppConfig.PFX_PWD.toCharArray());

            } catch (Exception e) {

            }finally{
                intream.close();
            }
            SSLContext sslContext = SSLContexts.custom().loadKeyMaterial(trustStore, AppConfig.PFX_PWD.toCharArray()).build();
//            SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).loadKeyMaterial(trustStore, AppConfig.PFX_PWD.toCharArray()).build();
            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext
                    ,new String[]{"TLSv1","TLSv1.1","TLSv1.2"}
                    ,null
                    ,SSLConnectionSocketFactory.getDefaultHostnameVerifier());
            CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
            HttpPost httppost = new HttpPost(url);
            httppost.addHeader("Content-type", "application/json; charset=utf-8");
//            httppost.addHeader("Connection", "Close");
            StringEntity requestEntity = new StringEntity(params,"utf-8");
            httppost.setEntity(requestEntity);
            CloseableHttpResponse response = httpClient.execute(httppost);
            logger.error("response=:{}",response);
            try {
                HttpEntity  entity = response.getEntity();
                returnData  = EntityUtils.toString(entity,"utf-8");
                EntityUtils.consume(entity);
                logger.error("returnData=:{}",returnData);
            } catch (Exception e) {
                 logger.error("catch");
            }finally{
                response.close();
            }
        } catch (Exception e) {
            logger.error("catch");
        }

        return returnData;
    }

 

<think>好的,用户现在问的是“如何直接访问API试”。之前他遇到的问题是加入详情页后API数据无法显示,现在可能想通过直接试API来排查问题。我需要先回顾之前的对话,确保回答的一致性。 首先,用户之前的问题可能涉及前后端交互,尤其是在新增详情页后出现的问题。直接访问API试可以绕过客户端,直接检查服务端是否正常响应,这有助于确定问题是出在客户端还是服务端。 用户可能是开发人员,或者至少有一定技术背景,需要具体的操作步骤和工具推荐。之前的回答里提到了使用curl命令和工具如Postman,可能需要详细展开这些方法。 用户的需求可能包括多种方法:命令行工具、图形化工具、浏览器扩展等。需要分步骤说明,确保不同技术水平的用户都能理解和操作。 另外,用户可能关心如何解析和验证返回的数据,比如JSON格式化、状态码检查、参数试等。需要涵盖这些方面,并提供实际例子,比如curl的具体用法,Postman的设置步骤。 还要注意安全性,比如处理HTTPS证书、认证方式(如API密钥、Bearer Token)的添加方法,这些在试API时常见的问题需要提及。 可能还需要包括常见问题排查,比如网络问题、跨域错误、参数错误等,帮助用户快速定位问题。例如,使用--insecure绕过证书检查,或者检查CORS头。 最后,推荐一些工具,比如之前的Stetho和Charles,或者新的如Insomnia,让用户有更多选择。确保回答结构清晰,步骤明确,实用性强。</think>--- ### **直接访问API试的完整指南** 直接试API是验证接口可用性的核心手段,尤其当客户端出现异常时,能快速定位服务端或参数问题。以下是具体操作方法和工具详解: --- #### **一、基础试工具** **1. 命令行工具(Curl)** ```bash # 通用GET请求(含HTTPS证书验证) curl -X GET "https://api.example.com/data?page=1&limit=20" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_token_here" # POST请求JSON body) curl -X POST "https://api.example.com/login" \ -H "Content-Type: application/json" \ -d '{"username":"test","password":"123456"}' # 调试模式(显示完整通信过程) curl -v -k "https://api.example.com" # -k参数忽略SSL证书验证 ``` **关键参数说明**: - `-X`: 指定HTTP方法(GET/POST/PUT/DELETE) - `-H`: 添加请求头(如认证信息) - `-d`: 发送POST请求的body数据 - `--data-binary`: 上传文件(如`@file.json`) --- #### **二、图形化工具推荐** **1. Postman** - **核心功能**: - 环境变量管理(多套试环境快速切换) - 自动化试脚本(JavaScript编写断言) - Mock Server(模拟未完成的API) - **操作步骤**: 1. 创建新请求 → 输入URL和Method 2. 在`Headers`中添加`Authorization`等字段 3. 在`Body`中选择`raw/JSON`格式输入参数 4. 点击`Send`后查看响应状态码和内容 **2. Insomnia** - **特色功能**: - 响应结果差异对比(版本更新验证) - 代码片段生成(自动生成curl/JavaScript等代码) - 支持GraphQL查询 --- #### **三、浏览器直接试** **1. 地址栏直接访问** - 简单GET请求可直接在浏览器地址栏输入: ```url https://api.example.com/items?category=electronics&sort=price_asc ``` - **限制**: - 无法自定义请求头(如认证头) - 无法发送PUT/DELETE等非GET请求 **2. 开发者工具控制台** 在Chrome/Firefox中按`F12`打开控制台,使用`fetch`API: ```javascript // 发送认证头的请求 fetch('https://api.example.com/data', { method: 'GET', headers: { 'Authorization': 'Basic ' + btoa('user:pass'), 'X-Custom-Header': 'value' } }) .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error('Error:', error)); ``` --- #### **四、高级试场景** **1. 压力试(JMeter)** ```xml <!-- 试计划示例 --> <ThreadGroup num_threads="100" ramp_time="10"> <HTTPSampler domain="api.example.com" port="443" path="/search" method="GET"> <arguments> <Argument name="keyword" value="test"/> </arguments> </HTTPSampler> </ThreadGroup> ``` - 重点监控指标: - 吞吐量(Requests/sec) - 95%响应时间 - 错误率 **2. 自动化验证(Python requests)** ```python import requests import json def test_api(): headers = {'User-Agent': 'Mozilla/5.0'} try: response = requests.get( 'https://api.example.com/status', headers=headers, timeout=5 ) response.raise_for_status() # 自动检4xx/5xx错误 data = response.json() assert data['status'] == 'OK', "状态异常" print("API试通过") except requests.exceptions.RequestException as e: print(f"请求失败: {e}") test_api() ``` --- #### **五、常见问题排查表** | 问题现象 | 可能原因 | 解决方案 | |-------------------------|---------------------------|-------------------------------| | **401 Unauthorized** | Token过期或权限不足 | 检查`Authorization`头格式 | | **404 Not Found** | 接口路径变更 | 对比最新API文档确认URL | | **500 Internal Error** | 服务端逻辑错误 | 检查请求参数是否含非法字符 | | **SSL证书错误** | 自签名证书或域名不匹配 | 添加`-k`参数(仅试环境用) | | **响应数据为空** | 分页参数超出实际范围 | 试`page=1&limit=1`等小数据量| --- #### **六、专业技巧** 1. **实时监控工具** - **Wireshark**:抓取网络层原始数据包,分析TCP握手过程 - **tcpdump**(Linux服务器端): ```bash tcpdump -i eth0 -s 0 -w api_capture.pcap port 443 ``` 2. **结果格式化** - 使用`jq`处理JSON响应: ```bash curl -s "https://api.example.com/data" | jq '.items[].title' ``` - 浏览器安装**JSON Formatter**扩展自动美化显示 --- 通过以上方法,可系统性地验证API的可用性、性能和数据准确性。建议从**基础curl命令**开始初步验证,再使用**Postman/JMeter**进行深度试,最后通过**代码化验证**实现持续集成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值