Java 发起 http 请求

左手的ㄟ右手 2022-10-31 13:59 325阅读 0赞

一、GET与POST

GET和POST是HTTP的两个常用方法。
GET指从指定的服务器中获取数据
POST指提交数据给指定的服务器处理

1.GET方法

使用GET方法,需要传递的参数被附加在URL地址后面一起发送到服务器。
例如:http://192.168.0.19/submit?name=zxy&age=21
特点:

  • GET请求能够被缓存
  • GET请求会保存在浏览器的浏览记录中
  • 以GET请求的URL能够保存为浏览器书签
  • GET请求有长度限制
  • GET请求主要用以获取数据

2.POST方法

使用POST方法,需要传递的参数在POST信息中单独存在,和HTTP请求一起发送到服务器。
例如:
POST /submit HTTP/1.1
Host 121.41.111.95
name=zxy&age=21

特点:

  • POST请求不能被缓存下来
  • POST请求不会保存在浏览器浏览记录中
  • 以POST请求的URL无法保存为浏览器书签
  • POST请求没有长度限制

实现代码

下面将Java发送GET/POST请求封装成HttpRequest类,可以直接使用。HttpRequest类代码如下:

  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.io.PrintWriter;
  5. import java.net.URL;
  6. import java.net.URLConnection;
  7. import java.util.List;
  8. import java.util.Map;
  9. //java项目www.fhadmin.org
  10. public class HttpRequest {
  11. /**
  12. * 向指定URL发送GET方法的请求
  13. *
  14. * @param url
  15. * 发送请求的URL
  16. * @param param
  17. * 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
  18. * @return URL 所代表远程资源的响应结果
  19. */
  20. public static String sendGet(String url, String param) {
  21. String result = "";
  22. BufferedReader in = null;
  23. try {
  24. String urlNameString = url + "?" + param;
  25. URL realUrl = new URL(urlNameString);
  26. // 打开和URL之间的连接
  27. URLConnection connection = realUrl.openConnection();
  28. // 设置通用的请求属性
  29. connection.setRequestProperty("accept", "*/*");
  30. connection.setRequestProperty("connection", "Keep-Alive");
  31. connection.setRequestProperty("user-agent",
  32. "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
  33. // 建立实际的连接
  34. connection.connect();
  35. // 获取所有响应头字段
  36. Map<String, List<String>> map = connection.getHeaderFields();
  37. // 遍历所有的响应头字段
  38. for (String key : map.keySet()) {
  39. System.out.println(key + "--->" + map.get(key));
  40. }
  41. // 定义 BufferedReader输入流来读取URL的响应
  42. in = new BufferedReader(new InputStreamReader(
  43. connection.getInputStream()));
  44. String line;
  45. while ((line = in.readLine()) != null) {
  46. result += line;
  47. }
  48. } catch (Exception e) {
  49. System.out.println("发送GET请求出现异常!" + e);
  50. e.printStackTrace();
  51. }
  52. // 使用finally块来关闭输入流
  53. finally {
  54. try {
  55. if (in != null) {
  56. in.close();
  57. }
  58. } catch (Exception e2) {
  59. e2.printStackTrace();
  60. }
  61. }
  62. return result;
  63. }
  64. /**java项目www.fhadmin.org
  65. * 向指定 URL 发送POST方法的请求
  66. *
  67. * @param url
  68. * 发送请求的 URL
  69. * @param param
  70. * 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
  71. * @return 所代表远程资源的响应结果
  72. */
  73. public static String sendPost(String url, String param) {
  74. PrintWriter out = null;
  75. BufferedReader in = null;
  76. String result = "";
  77. try {
  78. URL realUrl = new URL(url);
  79. // 打开和URL之间的连接
  80. URLConnection conn = realUrl.openConnection();
  81. // 设置通用的请求属性
  82. conn.setRequestProperty("accept", "*/*");
  83. conn.setRequestProperty("connection", "Keep-Alive");
  84. conn.setRequestProperty("user-agent",
  85. "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
  86. // 发送POST请求必须设置如下两行
  87. conn.setDoOutput(true);
  88. conn.setDoInput(true);
  89. // 获取URLConnection对象对应的输出流
  90. out = new PrintWriter(conn.getOutputStream());
  91. // 发送请求参数
  92. out.print(param);
  93. // flush输出流的缓冲
  94. out.flush();
  95. // 定义BufferedReader输入流来读取URL的响应
  96. in = new BufferedReader(
  97. new InputStreamReader(conn.getInputStream()));
  98. String line;
  99. while ((line = in.readLine()) != null) {
  100. result += line;
  101. }
  102. } catch (Exception e) {
  103. System.out.println("发送 POST 请求出现异常!"+e);
  104. e.printStackTrace();
  105. }
  106. //使用finally块来关闭输出流、输入流
  107. finally{
  108. try{
  109. if(out!=null){
  110. out.close();
  111. }
  112. if(in!=null){
  113. in.close();
  114. }
  115. }
  116. catch(IOException ex){
  117. ex.printStackTrace();
  118. }
  119. }
  120. return result;
  121. }
  122. }

实例演示

  1. #app的路由地址"/show"即为ajax中定义的url地址,采用POST、GET方法均可提交
  2. @app.route("/show",methods=["GET", "POST"])
  3. def show():
  4. #首先获取前端传入的name数据
  5. if request.method == "POST":
  6. name = request.form.get("name")
  7. if request.method == "GET":
  8. name = request.args.get("name")
  9. #创建Database类的对象sql,test为需要访问的数据库名字 具体可见Database类的构造函数
  10. sql = Database("test")
  11. try:
  12. #执行sql语句 多说一句,f+字符串的形式,可以在字符串里面以{}的形式加入变量名 结果保存在result数组中
  13. result = sql.execute(f"SELECT type FROM type WHERE name='{name}'")
  14. except Exception as e:
  15. return {'status':"error", 'message': "code error"}
  16. else:
  17. if not len(result) == 0:
  18. #这个result,我觉得也可以把它当成数据表,查询的结果至多一个,result[0][0]返回数组中的第一行第一列
  19. return {'status':'success','message':result[0][0]}
  20. else:
  21. return "rbq"

下面 我们利用POST方法发起请求,Java代码如下:

  1. //java项目www.fhadmin.org
  2. //创建发起http请求对象
  3. HttpRequest h = new HttpRequest();
  4. //向121.41.111.94/show发起POST请求,并传入name参数
  5. String content = h.sendPost("http://121.41.111.94/show","name=张新宇");
  6. System.out.println(content);

我们打印出content值,发现就是python中show()返回的json(在Java中,content被识别为String类型,而不是json)
在这里插入图片描述
(在转换过程中,不知道出什么问题了,中文显示了unicode编码。但在后面的转json格式后就没有这样的问题了)

字符串转json

Java成功发起Http请求后,由于返回值是String类型,而不是原本python函数中的json格式。所以我们需要将字符串类型转为json格式,并通过键值对的形式得出message对应的值
首先在maven中引入jar包:

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>fastjson</artifactId>
  4. <version>1.2.28</version>
  5. </dependency>

转换代码如下:

  1. import com.alibaba.fastjson.JSONObject;
  2. JSONObject jsonObject = JSONObject.parseObject(content);
  3. System.out.println(jsonObject);
  4. System.out.println(jsonObject.getString("message"));

![wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==][wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw]

运行结果:
在这里插入图片描述

[wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw]:

发表评论

表情:
评论列表 (有 0 条评论,325人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java发起http请求

    在日常工作中,我们经常会遇到需要调用内部 API 或者第三方 API 的情况,主要有以下方式: 一、HttpURLConnection 占坑 二、HttpClien