栀八月yu 2024-04-16 20:24 采纳率: 76.3%
浏览 18

怎么拼接https地址和参数

我这段代码在调用sendJsonGet工具类的时候报错了,因为工具类里面拼接的有问号,我代码里面拼接的也有问号,因为请求地址里面有变量,怎么用StringBuffer方法将链接和参数分开拼接啊
图一是代码和报错信息

img


图二是请求地址和请求参数

img


下面是调用的工具类,工具类不能修改

public static String sendJsonGet(String url, String path,Map<String, String> headParams) {
        String result = "";
        BufferedReader in = null;
        try {
            // 拼接参数,可以用URIBuilder,也可以直接拼接在?传值,拼在url后面
            //URIBuilder uriBuilder = new URIBuilder(url);
            String psthUrl=URLEncoder.encode(path,"utf-8");

            URL realUrl =new URL(url+"?"+psthUrl);
            // 打开和URL之间的连接
            URLConnection connection = realUrl.openConnection();
            // 获取请求头Map
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            // 设置通用的请求属性\
            connection.setRequestProperty("Content-type", "application/json; charset=UTF-8");
            for (String key : headParams.keySet()) {
                connection.setRequestProperty(key,headParams.get(key));
            }
            connection.setConnectTimeout(180000);
            connection.setReadTimeout(180000);
            // 建立实际的连接
            connection.connect();
            // 定义 BufferedReader输入流来读取URL的响应
            System.out.println("请求地址  =="+url);
            in = new BufferedReader(new InputStreamReader(
                    connection.getInputStream(),"UTF-8"));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            log.error("发送GET请求出现异常!\r\n" + e);
            result = e.toString();
        }
        // 使用finally块来关闭输入流
        finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e2) {
                log.error(e2);
            }
        }
        return result;
    }

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-16 20:24
    关注

    引自免费微信小程序:皆我百晓生

    从您提供的信息来看,您的问题是关于如何正确地拼接HTTPS地址和参数,并且在调用sendJsonGet方法时遇到的问题。首先,让我们分析一下错误信息。根据错误堆栈,可以看到抛出了一个FileNotFoundException,这通常是因为服务器没有找到指定的资源。

    为了解决这个问题,我们需要确保URL是正确的,并且所有参数都被正确编码。以下是修改后的sendJsonGet方法,以及对您原始代码的调整:

    import java.net.URISyntaxException;
    import java.nio.charset.StandardCharsets;
    import java.util.Map;
    
    public class HttpRequestUtil {
    
        public static String sendJsonGet(String baseUrl, String path, Map<String, String> headers, Map<String, String> queryParams) throws URISyntaxException {
            StringBuilder urlBuilder = new StringBuilder(baseUrl);
    
            // 添加路径参数
            urlBuilder.append(path);
    
            // 添加查询参数
            if (!queryParams.isEmpty()) {
                urlBuilder.append('?');
                boolean first = true;
                for (Map.Entry<String, String> entry : queryParams.entrySet()) {
                    if (first) {
                        first = false;
                    } else {
                        urlBuilder.append('&');
                    }
                    urlBuilder.append(URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8)).append('=').append(URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8));
                }
            }
    
            URL realUrl = new URL(urlBuilder.toString());
            // ...此处保持不变,即HTTP连接部分的代码...
    
            return result;
        }
    }
    

    然后,在您的业务逻辑部分,这样调用这个方法:

    Map<String, String> headers = new HashMap<>();
    headers.put("o-access-token", accessToken);
    
    Map<String, String> queryParams = new HashMap<>();
    queryParams.put("page_number", Integer.toString(i));
    queryParams.put("page_size", "1000");
    
    String enterpriseId = "1679728000825954315";
    String cusId = "2017452773225926656";
    
    String path = "/" + enterpriseId + "/study_projects/" + cusId + "/user_monitors";
    
    try {
        String studyProjectsFastBody = HttpRequestUtil.sendJsonGet(
            "https://o1.cn/api/v2",
            path,
            headers,
            queryParams
        );
        LOG.info("项目信息接口获取的值:" + studyProjectsFastBody);
    } catch (URISyntaxException e) {
        LOG.error("URL构造异常:", e);
    }
    

    在这个修复方案中,我做了以下更改:

    1. 创建了一个新的sendJsonGet方法,接受一个基础URL、一个路径字符串、一个header参数映射和一个查询参数映射。
    2. 在方法内部,我构建了一个URL字符串,先添加了基础URL,然后是路径,最后是经过URL编码的查询参数。
    3. 调整了调用sendJsonGet的方法,将企业ID和用户ID作为路径的一部分传递,同时创建一个新的查询参数映射,包含了分页参数。
    4. 我还处理了可能的URISyntaxException异常,以便在URL构造失败时捕获并记录错误。

    这样应该能解决您的问题。记得替换掉上面代码中的accessTokenenterpriseIdcusId为你实际的值。如果有任何问题,随时向我提问。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 4月16日
  • 创建了问题 4月16日

悬赏问题

  • ¥20 python忆阻器数字识别
  • ¥15 无法输出helloworld
  • ¥15 高通uboot 打印ubi init err 22
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊
  • ¥15 振荡电路,ADS仿真