使用httpClient访问https远程服务器调用远程接口并且传递参数以及忽略SSL证书的问题

使用httpClient访问https远程服务器调用远程接口并且传递参数以及忽略SSL证书的问题

首先写一个httpClient主要调用远程API和参数传递

import com.hxsj.inspection.common.util.SSLClient;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.util.EntityUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * @program: inspection-project
 * @description: 使用httpClient访问远程api
 * @author: Chai.duolai
 * @create: 2019-04-15 16:19
 **/
@RequestMapping("httpClient")
@RestController
public class HttpClients {
    @PostMapping("/postNoArguments")
    public  String postNoArguments() throws Exception {
   //以下是我自己调用的接口需要传递的参数
        Random random=new Random();
        String accesskey="xxx";
        //获得一个随机数
        String nonce = String.valueOf(random.nextInt());
        //获得一个时间戳
        String timestamp = String.valueOf(System.currentTimeMillis());
        StringBuffer stringBuffer=new StringBuffer();
        String secretkey="xxx";
        //将上面的三个参数按照顺序合并成一个字符串
        String signaturee = stringBuffer.append(secretkey).append(nonce).append(timestamp).toString();
        //在这里我要调用的api传递的第四个参数需要计算它的SHA1值(40位的)
        String signature= sha1(signaturee);
        //这里就是你要访问的具体地址了,填你自己的
        String url = "https://IP地址/api/token";
        //创建 MultipartEntityBuilder,以此来构建我们的参数
        MultipartEntityBuilder EntityBuilder = MultipartEntityBuilder.create();
//设置字符编码,防止乱码
        ContentType contentType= ContentType.create("text/plain", Charset.forName("UTF-8"));
//填充我们的文本内容,这里相当于input 框中的 name 与value
        EntityBuilder.addPart("accesskey", new StringBody(accesskey,contentType));
        EntityBuilder.addPart("nonce", new StringBody(nonce,contentType));
        EntityBuilder.addPart("timestamp", new StringBody(timestamp,contentType));
        EntityBuilder.addPart("signature", new StringBody(signature,contentType));

        CloseableHttpClient httpClient =null;
        HttpPost httpPost = null;
        String result = null;
        try{
            httpClient = new SSLClient();
            httpPost = new HttpPost(url);
            //在这里必须强调一点的是,看你调用的接口需要的参数格式是什么
            //我这里接口的参数格式是form-data类型的,如果你需要传值json或者别的类型我在下面会写到,别急
//            httpPost.addHeader("Content-Type", "application/json");
            /*StringEntity se = new UrlEncodedFormEntity(formList, "utf-8");
            se.setContentType("text/json");
            se.setContentEncoding(new BasicHeader("Content-Type", "application/json"));*/
            httpPost.setEntity(EntityBuilder.build());
            HttpResponse response = httpClient.execute(httpPost);
            if(response != null){
                HttpEntity resEntity = response.getEntity();
                if(resEntity != null){
                    result = EntityUtils.toString(resEntity,"UTF-8");
                    System.out.println("响应内容为"+result);
                }
            }
        }catch(Exception ex){
            ex.printStackTrace();
        }finally {
        //在这里强调一下httpClient一定要关闭。不然会出错
            httpClient.close();
        }
        return result;
    }

在代码中我有说到我的第四个参数需要计算SHA1的值,下面代码可以参考

 public static String sha1(String data) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("SHA1");
        md.update(data.getBytes());
        StringBuffer buf = new StringBuffer();
        byte[] bits = md.digest();
        for(int i=0;i<bits.length;i++){
            int a = bits[i];
            if(a<0) a+=256;
            if(a<16) buf.append("0");
            buf.append(Integer.toHexString(a));
        }
        return buf.toString();
    }

标题:由于本人也是第一次,所以尝试了很多坑,希望看到这篇博客的人可以帮到你

刚在在代码中说到了调用api传不同格式的参数问题,我看了一篇博客写的很好,你们可以根据它的改一下就好,我的参数是form-data方式格式的,当然了还有json类型的

插入链接:http://www.cnblogs.com/iscys/p/9595358.html 可以看看他的传递参数

接下来就是处理SSL证书的问题,第一次遇到,当时请教了很多人,这个我也是看了一篇博客的,如有侵权,望告知删除

import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;

/**
 * @program: inspection-project
 * @description: 忽略安全证书
 * @author: Chai.duolai
 * @create: 2019-04-16 09:56
 **/
public class SSLClient extends DefaultHttpClient {
    public SSLClient() throws Exception{
        super();
        SSLContext ctx = SSLContext.getInstance("TLS");
        X509TrustManager tm = new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] chain,
                                           String authType) throws CertificateException {
            }
            @Override
            public void checkServerTrusted(X509Certificate[] chain,
                                           String authType) throws CertificateException {
            }
            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        };
        ctx.init(null, new TrustManager[]{tm}, null);
        SSLSocketFactory ssf = new SSLSocketFactory(ctx, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
        ClientConnectionManager ccm = this.getConnectionManager();
        SchemeRegistry sr = ccm.getSchemeRegistry();
        sr.register(new Scheme("https", 443, ssf));
    }
}
  • 本人的邮箱[email protected] 如果有什么问题或者学术交流,很愿意和你一起探讨,可以把微信给你发送过去
    使用httpClient访问https远程服务器调用远程接口并且传递参数以及忽略SSL证书的问题_第1张图片

你可能感兴趣的:(使用httpClient访问https远程服务器调用远程接口并且传递参数以及忽略SSL证书的问题)