对接外部接口-完美解决HttpURLConnection获取数据不全问题

本文介绍如何完美解决使用Java的HttpURLConnection在对接外部接口时遇到的XML数据接收不完整的问题,详细分析了问题原因并提供了解决方案。
部署运行你感兴趣的模型镜像

完美解决HttpURLConnection获取数据不全问题

问题:外部接口返回xml时,时而获取正确,时而获取一部分数据

package com.weijy.utils;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;

/**
 * @author: weijy
 *
 * <pre>
 * 功能:httpUrlConnection访问远程接口工具
 * 日期:2021年10月12日 上午10:19:21
 * </pre>
 */
public class HttpUrlConnectionUtil {

    /**
     * <pre>
     * 方法体说明:向远程接口发起请求,返回字符串类型结果
     * @param url 接口地址
     * @param requestMethod 请求方式
     * @param params 传递参数     重点:参数值需要用Base64进行转码
     * @return String 返回结果
     * </pre>
     */
    public static String httpRequestToString(String url, String requestMethod,
                                             Map<String, String> params){

        String result = null;
        try {
            InputStream is = httpRequestToStream(url, requestMethod, params);

			//方式一
            ByteArrayOutputStream data = new ByteArrayOutputStream();
            //设置接收附件最大10MB
            byte [] fileByte = new byte[10*1024*1024];
            int len =0;

            while((len=is.read(fileByte))!=-1) {
                data.write(fileByte,0,len);
            }
			//方式二
			//网络不好时,数据接受不全,适用于本地获取
            /*
            byte[] b = new byte[is.available()];
            is.read(b);
            result = new String(b);*/
            result = data.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * <pre>
     * 方法体说明:向远程接口发起请求,返回字节流类型结果
     * 作者:weijy
     * 日期:2021年10月13日 上午11:20:25
     * @param url 接口地址
     * @param requestMethod 请求方式
     * @param params 传递参数     重点:参数值需要用Base64进行转码
     * @return InputStream 返回结果
     * </pre>
     */
    public static InputStream httpRequestToStream(String url, String requestMethod,
                                                  Map<String, String> params){

        InputStream is = null;
        try {
            String parameters = "";
            boolean hasParams = false;
            //将参数集合拼接成特定格式,如name=zhangsan&age=24
            if (params != null) {
                for(String key : params.keySet()){
                    String value = URLEncoder.encode(params.get(key), "UTF-8");
                    parameters += key +"="+ value +"&";
                    hasParams = true;
                }
            }

            if(hasParams){
                parameters = parameters.substring(0, parameters.length()-1);
            }

            //请求方式是否为get
            boolean isGet = "get".equalsIgnoreCase(requestMethod);
            //请求方式是否为post
            boolean isPost = "post".equalsIgnoreCase(requestMethod);
            if(isGet){
                url += "?"+ parameters;
            }

            URL u = new URL(url);
            HttpURLConnection conn = (HttpURLConnection) u.openConnection();

            //请求的参数类型(使用restlet框架时,为了兼容框架,必须设置Content-Type为“”空)
            conn.setRequestProperty("Content-Type", "application/octet-stream");
            //conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            //设置连接超时时间
            conn.setConnectTimeout(50000);
            //设置读取返回内容超时时间
            conn.setReadTimeout(50000);
            //设置向HttpURLConnection对象中输出,因为post方式将请求参数放在http正文内,因此需要设置为ture,默认false
            if(isPost){
                conn.setDoOutput(true);
            }
            //设置从HttpURLConnection对象读入,默认为true
            conn.setDoInput(true);
            //设置是否使用缓存,post方式不能使用缓存
            if(isPost){
                conn.setUseCaches(false);
            }
            //设置请求方式,默认为GET
            conn.setRequestMethod(requestMethod);

            //post方式需要将传递的参数输出到conn对象中
            if(isPost){
                DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
                dos.writeBytes(parameters);
                dos.flush();
                dos.close();
            }

            //从HttpURLConnection对象中读取响应的消息
            //执行该语句时才正式发起请求
            is = conn.getInputStream();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return is;
    }
}

参考:https://blog.youkuaiyun.com/huijiaaa1/article/details/89727442
https://www.iteye.com/blog/javatea-2422253

您可能感兴趣的与本文相关的镜像

Seed-Coder-8B-Base

Seed-Coder-8B-Base

文本生成
Seed-Coder

Seed-Coder是一个功能强大、透明、参数高效的 8B 级开源代码模型系列,包括基础变体、指导变体和推理变体,由字节团队开源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值