前言:GET和POST从代码上看几乎一样,只有两点区别,请求类型的值和入参的方式。别看代码一大堆,你需要注意的也就三四行代码,其他都是通用固定的代码。为什么我没有拆分两块来写,就是清晰表明两个请求方式代码的差异性,当然实际项目中需要创两个函数当成工具类给业务使用,其实也就是把下面代码复制两份改个名字。友情提醒:把下面代码注释都读一遍,其实你也就理解了这些代码的逻辑和意义了。
1、发起GET,POST请求主体代码
// 创建URL对象,如果是GET方式入参拼到url内
URL obj = new URL(url);
// 使用方法openConnection()返回一个URLConnection对象,表示应用程序和URL之间的通信链接。URLConnection向URL发送请求,并读取URL引用的资源
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
// 设置请求类型,默认值GET,可选值POST
con.setRequestMethod("GET");
// 设置通用的请求属性,先不配等用到了再配置
con.setRequestProperty("accept", "*/*");
con.setRequestProperty("connection", "Keep-Alive");
con.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 设置超时时间,防止网络异常导致程序僵住
con.setConnectTimeout(3000);
// 设置是否从HttpUrlConnection输出,对于POST请求参数要放在http正文内,因此需要设为true,默认为false。
con.setDoOutput(true);
// 设置是否向HttpUrlConnection输入,将服务器端返回的数据存放在内,默认为true
con.setDoInput(true);
/****** 如果是post请求,请将下面的(2)代码放入这里 *******/
// 使用方法connect建立实际的连接
con.connect();
// 得到响应状态码的返回值code,如果返回值正常,数据在网络中是以流的形式得到服务端返回的数据
int code = con.getResponseCode();
// 从流中读取响应信息,通用
String msg="";
BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream())); // 编码utf-8,new InputStreamReader(InputStream,"utf-8")
String line = null;
while ((line = reader.readLine()) != null) { // 循环从流中读取
msg += line + "\n";
}
reader.close(); // 关闭流
// 断开连接,释放资源
con.disconnect();
2、POST请求的入参写法,两种方案任选其一
注意:下面入参为JSON序列化格式,例:"{\"appid\":\"value\"}"
// 写入参数到请求中,方案一
OutputStream out = con.getOutputStream();
out.write("入参".getBytes()); // 编码utf-8,getBytes("utf-8")
out.flush();
out.close();
// 写入参数到请求中,方案二
PrintWriter out = new PrintWriter(con.getOutputStream());
out.print("入参");
out.flush();
out.close();
3、知识点
1、如使用HttpURLConnection.getInputStream()方法的时系统会自动调用connect()方法
2、URLConnection 是 java.net 包中的一个抽象类,其主要用于实现应用程序与 URL 之间的通信。HttpURLConnection 继承自 URLConnection,也是抽象类。所以上面代码使用URLConnection接收obj.openConnection()也是可以的。
3、上面http请求返回的数据是json字符串,需要自己转成map对象方便使用,下面提供几个转换方法:
// 方法一
String jsonString = "{\"key1\":\"value1\",\"key2\":\"value2\"}";
Map<String, Object> map = new ObjectMapper().readValue(jsonString, new TypeReference<Map<String,Object>>(){});
// 方法二
String jsonString = "{\"key1\":\"value1\",\"key2\":\"value2\"}";
Map<String, Object> map = new Gson().fromJson(jsonString, new TypeToken<Map<String, Object>>(){}.getType());
// 方法三
String jsonString = "{\"key1\":\"value1\",\"key2\":\"value2\"}";
Map<String, Object> map = JSON.parseObject(jsonString, new TypeReference<Map<String, Object>>(){});