前几天使用HttptUrlConnection调用SpringBoot框架下的接口时遇到了一点超出预期的东西。
想必大家都知道,为了安全起见,都会在单点登录中使用tonken类似的验证,很不幸,我也遇到了,在使用post请求服务器时需要一个验证码,并且这个验证码是有服务器给Post请求的,无法使用手工拼接。然后我不得不使用get方法来调用接口。然后,并没有预想的顺利!
public class HttpClient {
private static Logger logger = Logger.getLogger(HttpClient.class);
/**
* @param url=ip+?+para
* @param method POST 或者GET
* @param charset 编码格式
* @return
*/
public static String getHttpConnection(String url, String method, String charset) {
String message = ""; // 返回信息
OutputStream os = null; // 输出流
StringBuffer sb = null; // 字符串缓冲流
BufferedReader br = null; // 缓冲字符串输入流
HttpURLConnection conn = null;
try {
// 创建HTTP的URL对象
URL getURL = new URL(url);
// 获取一个 HttpURLConnection 链接对象
conn = (HttpURLConnection) getURL.openConnection();
// 使用 java.net.URL 链接进行输出时,须将DoOutput标志设true
conn.setDoOutput(true);
// 设置通用的请求属性
// conn.setRequestProperty("ContentType","text/xml;charset=UTF-8");
// 用 get 方式传递数据
conn.setRequestMethod(method);
// 设置链接超时时间 5秒
conn.setConnectTimeout(60 * 1000);
// 设置读取超时时间 20秒
conn.setReadTimeout(20 * 1000);
// 取得输出流
os = conn.getOutputStream();
// 设置输出流格式 UTF-8
os.write(message.getBytes(charset));
// 接口调用后,获取返回的输入流,并把返回的流转换为字符串String
br = new BufferedReader(new InputStreamReader( conn.getInputStream(), charset) );
sb = new StringBuffer();
while (br.ready()) {
sb.append(br.readLine());
}
message = sb.toString();
logger.info("HttpClient请求返回的字符串:" + message);
System.out.println("HttpClient请求返回的字符串:" + message);
return message;
} catch (Exception e) {
logger.error("连接HTTP出现异常,请排查! message:" + e.getMessage());
e.printStackTrace();
return message;
} finally {
try {
if (os != null) {
os.flush();
os.close();
}
br.close();
conn.disconnect();// 断开连接
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
对于代码不多做解释。这个方法一开始是用于Post请求的,对于没有tonken验证的程序也可以正常调用接口,但是当我把method的值设为GET时,这个请求任然是一个Post请求。找了网上各种资历,找了大牛~~任然没找到病原所在!于是,自己开了断点,最后找到症结所在,竟然是它:os = conn.getOutputStream();
os.write(message.getBytes(charset));
一开始也很纳闷,这是为什么。自己看了一下,这个输出流到底是干嘛用的:众所周知POST请求和GET请求的区别,这个输出流就是用来设置参数的!然而,get请求的参数都在地址后面,以?分隔,用&连接,只有post请求才有单独存放参数的空间。
到此,问题很明显了,在设置这个输出流的时候你就已经告诉HttpURLConnection你要发送的是POST请求!所以,最终的结果就是你期待的GEt请求变为了POST请求!
然后把输出流干掉,GET请求成功!
最后说一个自己发现的小问题,就是这个GET请求,当你连续发送多次时会出现数据丢失的现象:目标接口返回的数据是{"status":"1","message":"请求成功"},但是HttpURLConnection.getInputStream(),的值却是""!我在一直寻找原因,但是到现在也没有发现!如果有朋友知道原因何在,希望能告知!
相关推荐
在 Java 中发送 GET 和 POST 请求是非常常见的操作,今天我们将通过使用 Apache HttpClient 库来实现这些操作。 什么是 Apache HttpClient 库? Apache HttpClient 库是 Apache 软件基金会提供的一个开源库,用于...
- 在发送请求之前,确保网络连接正常。 - 使用`try-catch-finally`结构来捕获可能的异常,并确保在`finally`块中释放资源,避免内存泄漏。 - 在处理响应时,注意编码问题,例如上述代码中的“UTF-8”。 - 如果在生产...
java 发送https get请求工具类
在发送请求之前,我们使用`open`方法初始化请求,并将请求方法设置为"GET"。 当XMLHttpRequest对象的请求状态发生变化时,会触发`onreadystatechange`事件,并执行回调函数`finish`。在此函数中,我们根据`...
在 JSP 文件中,我们可以使用 Servlet 来处理 Ajax 发送的 GET 请求。在本文中,我们使用 LoginServlet 来处理用户名的验证。 首先,我们需要在 web.xml 文件中配置 Servlet 的信息: ```xml <servlet-name>...
在这个“feignclient发送get请求使用dto接收参数demo”中,我们将探讨如何利用FeignClient来发送GET请求,并通过DTO(Data Transfer Object)来接收和处理参数。 1. **FeignClient介绍** Feign是一个Java到Java的...
在C#编程中,HTTP(超文本传输协议)是用于客户端和服务器之间通信的主要协议,主要涉及GET和POST...这个程序可能包含一个窗口,用户输入请求参数,点击按钮后,程序使用`HttpClient`发送请求,并将结果展示在界面上。
HttpClient(用CloseableHttpClient发送get/post请求)
5. 执行请求:使用HttpClient的`execute()`方法发送请求。 ```java CloseableHttpResponse response = httpClient.execute(req); ``` 6. 处理响应:获取并解析服务器返回的响应,例如,获取状态码、响应头和响应体...
这个文件可能包含了设置socket连接、构建GET请求、发送请求、接收响应、解析Json数据等功能的实现。如果需要进一步了解或使用这个工具,需要查看文件内容并根据其结构进行编译和运行。 总的来说,通过socket发送GET...
在C#中,你可以使用`HttpClient`类的`GetStringAsync`方法来发送GET请求,如下所示: ```csharp using System.Net.Http; using System.Threading.Tasks; public async Task<string> GetDataFromGet(string url) { ...
在使用Feign客户端发送GET请求时,如果需要传递复杂的查询条件或分页参数,开发人员往往会倾向于使用Java POJO(Plain Old Java Object)对象作为方法参数。例如: ```java @FeignClient("microservice-provider-...
接下来,我们讨论如何使用HttpClient进行GET请求。GET请求通常用于获取资源,不涉及请求体: ```java CloseableHttpClient httpClient = HttpClients.createDefault(); HttpGet httpGet = new HttpGet(...
- POST请求用于向服务器发送数据,通常用于表单提交、文件上传等场景。数据包含在请求体中。 - `HttpConnUtils.jar`的`sendPostRequest()`方法可能接收URL、请求参数和可能的请求头。它使用`setDoOutput(true)`...
本文将详细介绍如何使用`curl`进行简单的GET请求,并将服务器的响应内容保存到本地文件。 首先,我们需要理解GET请求是HTTP协议中最基础的一种请求方法,它用于从服务器获取资源。在`curl`命令中执行GET请求非常...
qt工程中引入编译好的curl库,封装了一个类来执行post请求 可以直接拿来改造。 数据格式为json格式
本文将详细讲解如何使用Java发送GET和POST请求,以及涉及的HTTPS安全连接。 首先,理解HTTP和HTTPS的区别至关重要。HTTP(超文本传输协议)是一种用于分发超媒体信息的应用层协议,而HTTPS(超文本传输安全协议)是...
50行代码http发送Post/Get请求,直接在linux gcc编译即可使用,或在win下任意c/c++编译器都可
java实现get请求post请求,文件传输 /** * 发送https请求 * @param requestUrl 请求地址 * @param requestMethod 请求方式(GET、POST) * @param outputStr 提交的数据 * @return 返回微信服务器响应的信息 ...