java 使用 RestTemplate和HttpUtils.doGet(url) 进行请求发送 报错 400 奇怪的原因

文章讲述了在腾讯云部署中,通过RestTemplate进行内网请求时遇到的400错误,原因是URL中的汉字和特殊符号未进行编码。作者提供了URL编码解决方案,并提到C#服务可能需要编码参数才能正确接收。同时提及了作者的微信小游戏作品。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

发生原因

在腾讯云部署有两个服务器,之前请求是合适的。因业务需求打算将两个服务的请求方式修改为内网请求。所以就有了 使用 RestTemplate 发生请求返回 400的错误。代码如下
下面展示一些 内联代码片

	import org.springframework.web.client.RestTemplate;
    
    @Autowired
    RestTemplate restTemplate;

// 方法中使用 之前以为是 utf8乱码导致所以进行了编码定义
        restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(StandardCharsets.UTF_8));

        HttpHeaders headers = new HttpHeaders();
        headers.set("Accept-Charset", "UTF-8");
        HttpEntity<String> entity = new HttpEntity<>(headers);

		String url ="127.0.0.1:/wx/aa?can=你好"
		ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
        responseBody = response.getBody();
        System.out.println("------返回信息:"+responseBody);

如此以上代码会偶发报错 返回400
内网中调用的服务是C#编写。
经后面仔细琢磨后。

原因 是url请求地址中 所带的参数中有汉字导致。包括特殊符号。需要对所带参数部分进行URL编码后进行请求。

一下方法是用来判断参数是否进行了编码,未编码则进行编码
下面展示一些 内联代码片

// 判断是否进行了url编码未编码进行编码输出,进行了编码则不用处理
        public String urlCode(String input) throws UnsupportedEncodingException {
            String decodedInput = URLDecoder.decode(input, "UTF-8");
            if (input.equals(decodedInput)) {
                System.out.println("字段:"+input+"未进行了 URL 编码,需处理");
                input = URLEncoder.encode(input, "UTF-8");
                System.out.println("编码后的字段: " + input);
            } else {
                System.out.println("字段"+input+"进行了 URL 编码,无需处理");
            }
            return input;
        }

另一种请求发送方式

	import com.wwjswly.common.util.HttpUtils;

	String url ="127.0.0.1:/wx/aa?can=你好"
	byte[] bytes = HttpUtils.doGet(url);
	responseString = new String(bytes, StandardCharsets.UTF_8);
    System.out.println("-----返回信息:"+responseString);

同样也存在url请求中存在汉字,这里发送回直接报错。

另外这次是接收请求的服务是使用c#编写,不知道是不是其中原因,必须要url编码后才能正确接收到参数。

另外作为游戏爱好者 开发了两款微信小游戏,供大家玩耍。
《3d决对》
3d决对
《酒馆卡牌》
酒馆卡牌

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值