通过OkHttpClient实现以json文件的形式发送http请求

近日做了个接口需求,要求把json数据放入文件中,以文件的形式发送http报文请求,在网上找了好多种方式,都没能联调成功,最终用了OkHttpClient才实现了。

测试如下

util工具类

直接复制过去即可,什么都不用改。

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import okhttp3.*;

import javax.net.ssl.*;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class OkHttpUtil {
    public static class SSLSocketFactoryImp extends SSLSocketFactory {
        private SSLContext sslContext = SSLContext.getInstance("SSL");
        private TrustManager trustManager = null;

        public SSLContext getSSLContext() {
            return sslContext;
        }

        public X509TrustManager getTrustManager() {
            return (X509TrustManager) trustManager;
        }

        public SSLSocketFactoryImp(KeyStore keyStore) throws NoSuchAlgorithmException, KeyManagementException {
            super();
            trustManager = new X509TrustManager() {
                @Override
                public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {

                }

                @Override
                public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {

                }

                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    //注意这里不能返回null,否则会报错,如下面错误[1]
                    X509Certificate[] x509Certificates = new X509Certificate[0];
                    return x509Certificates;
                }
            };

            sslContext.init(null, new TrustManager[]{trustManager}, null);
        }

        @Override
        public String[] getDefaultCipherSuites() {
            return new String[0];
        }

        @Override
        public String[] getSupportedCipherSuites() {
            return new String[0];
        }

        @Override
        public Socket createSocket() throws IOException {
            return sslContext.getSocketFactory().createSocket();
        }

        @Override
        public Socket createSocket(Socket socket, String host, int post, boolean autoClose) throws IOException {
            return sslContext.getSocketFactory().createSocket(socket, host, post, autoClose);
        }

        @Override
        public Socket createSocket(String s, int i) throws IOException, UnknownHostException {
            return null;
        }

        @Override
        public Socket createSocket(String s, int i, InetAddress inetAddress, int i1) throws IOException, UnknownHostException {
            return null;
        }

        @Override
        public Socket createSocket(InetAddress inetAddress, int i) throws IOException {
            return null;
        }

        @Override
        public Socket createSocket(InetAddress inetAddress, int i, InetAddress inetAddress1, int i1) throws IOException {
            return null;
        }
    }

    public static OkHttpClient getClient(Interceptor... interceptor) {
        OkHttpClient.Builder builder = null;
        try {
            builder = new OkHttpClient.Builder();
            //ssl verifier
            KeyStore trustStore;
            trustStore = KeyStore.getInstance(KeyStore
                    .getDefaultType());
            trustStore.load(null, null);
            SSLSocketFactoryImp ssl = new SSLSocketFactoryImp(KeyStore.getInstance(KeyStore.getDefaultType()));

            HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            };

            builder.sslSocketFactory(ssl.getSSLContext().getSocketFactory(), ssl.getTrustManager())
                    .hostnameVerifier(DO_NOT_VERIFY);
        } catch (Exception e) {
            //
        }
        return builder.build();
    }
}

Junit测试

public class haha{
	    public static void main(String[] args) {
        //1、先调用认证接口
        String APIUrl = "xxxxxxxxxxxx";
        String URL = "https://" + "xxx.xxx.xxx.xx" + ":" + "xxxx" + APIUrl;
        String username = "xxx";
        String pwd = "xxx";
        JSONObject json = new JSONObject();
        json.put("userName",username);
        json.put("password",pwd);
        // 生成json格式文件
        JSONObject job = doFilePost(json,URL);
        System.out.println("调用认证接口:"+job);
    }

    public static JSONObject doFilePost(JSONObject params,String url){
        try {
            //在项目根目录下创建一个文件
            File file = new File("file/post_request.json");
            if (!file.getParentFile().exists()) { // 如果父目录不存在,创建父目录
                file.getParentFile().mkdirs();
            }
            if (file.exists()) { // 如果已存在,删除旧文件
                file.delete();
            }
            file.createNewFile();
            //将格式化后的json字符串写入文件
            Writer write = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
            write.write(params.toJSONString());
            write.flush();
            write.close();

            OkHttpClient client = getClient();
            MediaType mediaType = MediaType.parse("text/plain");
            RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
                    .addFormDataPart("filename", file.getPath(),
                            RequestBody.create(MediaType.parse("application/octet-stream"),
                                    new File(file.getPath())))
                    .build();
            Request request = new Request.Builder()
                    .url(url)
                    .method("POST", body)
                    .addHeader("Accept-Language", "zh-cn")
                    .addHeader("Cookie", "SESSIONID=765c194a6ab8b92845717cc4033a024d; C_HASH=605DA24B")
                    .build();
            Response response = client.newCall(request).execute();
            JSONObject job = JSON.parseObject(response.body().string());
            return job;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值