IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> HttpURLConnection调用get方法碰到奇怪的编码问题--不同的方式调用同一个方法竟然有不同的结果 -> 正文阅读

[开发测试]HttpURLConnection调用get方法碰到奇怪的编码问题--不同的方式调用同一个方法竟然有不同的结果

今天在调用某接口查询企业名称的时候碰到奇怪的问题。

在页面上输入拼音能搜索到数据,输入汉字则不行。
在这里插入图片描述
在这里插入图片描述

询问了对方的技术人员,他说我传的内容是空的,这就奇怪了,我后台明明已经接收到“浙江”这个值了。

我用单元测试测了一下,接口没问题,但是在页面上查询就没数据。

为了确认一下接口没问题,我在调用对方接口的代码里把参数“浙江”两个字写死了:

public static String get(String sendUrl) {

		StringBuffer receive = new StringBuffer();
		HttpURLConnection URLConn = null;
		BufferedReader in = null;
		try {
			sendUrl = "http://***/APIService/search/advanceSearchNew?secret_key=***&appkey=***&keyword=浙江";
			System.out.println("sendUrl:" + sendUrl);
			URL url = new URL(sendUrl);
			URLConn = (HttpURLConnection) url.openConnection();

			URLConn.setDoInput(true);
			URLConn.connect();

			in = new BufferedReader(new InputStreamReader(URLConn.getInputStream(), "UTF-8"));

			String line;
			while ((line = in.readLine()) != null) {
				receive.append(line);
			}

		} catch (IOException e) {
			receive.append("访问产生了异常-->").append(e.getMessage());
			e.printStackTrace();
		} finally {
			if (in != null) {
				try {
					in.close();
				} catch (java.io.IOException ex) {
					ex.printStackTrace();
				}
				in = null;
			}
			
			URLConn.disconnect();

		}

		return receive.toString();
	}

在这里插入图片描述

这时候奇怪的事情发生了,从单元测试调用这个方法是正常的,而从页面上通过ajaix调用这个方法还是找不到数据,注意:这里的关键字“浙江”已经写死在代码里了,也就是说不管传什么参数都是一样的。

它们之间的区别仅仅是调用的路径不同,一个是从单元测试调用的,一个是从页面上调用的。

单元测试

代码如下:

 @Test
 public void searchCompany() {
     String baseUrl = "http://******/APIService/search/advanceSearchNew";
     Map<String, String> urlParams = new HashMap<String, String>();
     // 设置url参数
     urlParams.put("appkey", "******");
     urlParams.put("secret_key", "******");
     urlParams.put("keyword", "浙江");

     List<String> concatParams = new ArrayList<String>();
     for (String s : urlParams.keySet()) {
         concatParams.add(s + "=" + urlParams.get(s));
     }
     try {
         // 发送get请求,得到响应
         String response = HttpService.get(baseUrl + "?" + String.join("&", concatParams));
         System.out.println(response);
     } catch (Exception e) {
         e.printStackTrace();
     }
 }

这时候能成功调用,返回正常的结果:

sendUrl:http://****/APIService/search/advanceSearchNew?secret_key=****&appkey=****&keyword=浙江
{"status":"200","message":"操作成功","sign":"44200167b7e4cf3c6edd2fd043c613e7" ...}}

页面调用

通过页面ajax调用接口:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
参数也能正常传到Controller,问题是sendUrl我已经在方法里写死了,却得到了不一样的结果:

     /**
     * 获取公司列表
     */
    public static List<Map<String, String>> companyList(String keyword) {
        String baseUrl = "http://****/APIService/search/advanceSearchNew";
        Map<String, String> urlParams = new HashMap<String, String>();
        // 设置url参数
        urlParams.put("appkey", "****");
        urlParams.put("secret_key", "****");
        urlParams.put("keyword", keyword);

        List<String> concatParams = new ArrayList<String>();
        for (String s : urlParams.keySet()) {
            concatParams.add(s + "=" + urlParams.get(s));
        }
        try {
            // 发送get请求,得到响应
            String response = HttpService.get(baseUrl + "?" + String.join("&", concatParams));
            System.out.println(response);
            // 获取公司列表
            return getCompanyList(response);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

这时返回查询无结果:

sendUrl:http://****/APIService/search/advanceSearchNew?secret_key=****&appkey=****&keyword=浙江
{"status":"201","message":"查询无结果","sign":"f310015b7409b768bc61fc03a6a43d0b","data":{"total":0,"items":[]}}

再次提醒:keyword我已经在get方法里写死了。
在这里插入图片描述
真是百思不得其解啊!

后来通过wireshark抓包,终于知道问题的原因是编码问题。

这是通过单元测试的方法发送的请求,编码没有问题:

在这里插入图片描述

这是通过页面发送的请求,编码就有问题了:
在这里插入图片描述

不同的方式调用同一个方法,为什么会有这样的区别呢?真是搞不明白。。。

不过,既然知道是编码的问题,那么把参数编码成UTF-8是不是就行了?

public static String get(String sendUrl) {

		StringBuffer receive = new StringBuffer();
		HttpURLConnection URLConn = null;
		BufferedReader in = null;
		try {
			sendUrl = "http://****/APIService/search/advanceSearchNew?secret_key=****&appkey=****&keyword=" + URLEncoder.encode("浙江","UTF-8");
			System.out.println("sendUrl:" + sendUrl);
			...

把参数编码一下,添加URLEncoder.encode(“浙江”,“UTF-8”),试试看,结果返回正常:

sendUrl:http://****/APIService/search/advanceSearchNew?secret_key=****&appkey=****&keyword=%E6%B5%99%E6%B1%9F
{"status":"200","message":"操作成功","sign":"7afbd8dcda84f29a679420f4d4552dab","data":{...}}

抓包截图:
在这里插入图片描述

恩,这样就正常了。

但是单元测试的时候,为什么不编码也可以呢?而从页面上通过Controller调用就有编码问题?

这个疑问还没解开。。。

如果有大神知道,请不吝赐教,谢谢!

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-07-16 11:36:27  更:2021-07-16 11:36:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/20 1:47:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码