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

发生原因

在腾讯云部署有两个服务器,之前请求是合适的。因业务需求打算将两个服务的请求方式修改为内网请求。所以就有了 使用 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决对
《酒馆卡牌》
酒馆卡牌

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HttpUtils.sendGet是一个同步请求,如果要实现异步请求,可以使用Java中的多线程技术或者使用第三方库,比如OkHttp或者AsyncHttpClient。 使用多线程实现异步请求的示例代码如下: ```java public class MyThread extends Thread { private String url; public MyThread(String url) { this.url = url; } public void run() { // 发送HTTP GET请求 String result = HttpUtils.sendGet(url); // 处理响应结果 // ... } } // 创建线程并启动 MyThread thread = new MyThread("http://www.example.com/api"); thread.start(); ``` 使用OkHttp实现异步请求的示例代码如下: ```java OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("http://www.example.com/api") .build(); Call call = client.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 请求失败处理 } @Override public void onResponse(Call call, Response response) throws IOException { // 处理响应结果 String result = response.body().string(); // ... } }); ``` 使用AsyncHttpClient实现异步请求的示例代码如下: ```java AsyncHttpClient client = new AsyncHttpClient(); client.get("http://www.example.com/api", new AsyncHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { // 处理响应结果 String result = new String(responseBody); // ... } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { // 请求失败处理 } }); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值