余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

三分钟带你看懂Java发起http请求的完整步骤记录

xiyangw 2022-11-24 16:33 66 浏览 0 评论

这篇文章主要给大家介绍了关于Java发起http请求的相关资料,文中通过示例代码介绍得非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在未来做项目中,一些功能模块可能会采用不同的语言进行编写。这就需要http请求进行模块的调用。那么下面,我将以Java为例,详细说明如何发起http请求。

一、GET与POST

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

1.GET方法
使用GET方法,需要传递的参数被附加在URL地址后面一起发送到服务器。

例如:http://121.41.111.94/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.94
name=zxy&age=21

特点:

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

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

`import` `java.io.BufferedReader;`

`import` `java.io.IOException;`

`import` `java.io.InputStreamReader;`

`import` `java.io.PrintWriter;`

`import` `java.net.URL;`

`import` `java.net.URLConnection;`

`import` `java.util.List;`

`import` `java.util.Map;`

`public` `class` `HttpRequest {`

`/**`

`* 向指定URL发送GET方法的请求`

`*`

`* @param url`

`*   发送请求的URL`

`* @param param`

`*   请求参数,请求参数应该是 name1=value1&name2=value2 的形式。`

`* @return URL 所代表远程资源的响应结果`

`*/`

`public` `static` `String sendGet(String url, String param) {`

`String result =` `""``;`

`BufferedReader in =` `null``;`

`try` `{`

`String urlNameString = url +` `"?"` `+ param;`

`URL realUrl =` `new` `URL(urlNameString);`

`// 打开和URL之间的连接`

`URLConnection connection = realUrl.openConnection();`

`// 设置通用的请求属性`

`connection.setRequestProperty(``"accept"``,` `"*/*"``);`

`connection.setRequestProperty(``"connection"``,` `"Keep-Alive"``);`

`connection.setRequestProperty(``"user-agent"``,`

`"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"``);`

`// 建立实际的连接`

`connection.connect();`

`// 获取所有响应头字段`

`Map<String, List<String>> map = connection.getHeaderFields();`

`// 遍历所有的响应头字段`

`for` `(String key : map.keySet()) {`

`System.out.println(key +` `"--->"` `+ map.get(key));`

`}`

`// 定义 BufferedReader输入流来读取URL的响应`

`in =` `new` `BufferedReader(``new` `InputStreamReader(`

`connection.getInputStream()));`

`String line;`

`while` `((line = in.readLine()) !=` `null``) {`

`result += line;`

`}`

`}` `catch` `(Exception e) {`

`System.out.println(``"发送GET请求出现异常!"` `+ e);`

`e.printStackTrace();`

`}`

`// 使用finally块来关闭输入流`

`finally` `{`

`try` `{`

`if` `(in !=` `null``) {`

`in.close();`

`}`

`}` `catch` `(Exception e2) {`

`e2.printStackTrace();`

`}`

`}`

`return` `result;`

`}`

`/**`

`* 向指定 URL 发送POST方法的请求`

`*`

`* @param url`

`*   发送请求的 URL`

`* @param param`

`*   请求参数,请求参数应该是 name1=value1&name2=value2 的形式。`

`* @return 所代表远程资源的响应结果`

`*/`

`public` `static` `String sendPost(String url, String param) {`

`PrintWriter out =` `null``;`

`BufferedReader in =` `null``;`

`String result =` `""``;`

`try` `{`

`URL realUrl =` `new` `URL(url);`

`// 打开和URL之间的连接`

`URLConnection conn = realUrl.openConnection();`

`// 设置通用的请求属性`

`conn.setRequestProperty(``"accept"``,` `"*/*"``);`

`conn.setRequestProperty(``"connection"``,` `"Keep-Alive"``);`

`conn.setRequestProperty(``"user-agent"``,`

`"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"``);`

`// 发送POST请求必须设置如下两行`

`conn.setDoOutput(``true``);`

`conn.setDoInput(``true``);`

`// 获取URLConnection对象对应的输出流`

`out =` `new` `PrintWriter(conn.getOutputStream());`

`// 发送请求参数`

`out.print(param);`

`// flush输出流的缓冲`

`out.flush();`

`// 定义BufferedReader输入流来读取URL的响应`

`in =` `new` `BufferedReader(`

`new` `InputStreamReader(conn.getInputStream()));`

`String line;`

`while` `((line = in.readLine()) !=` `null``) {`

`result += line;`

`}`

`}` `catch` `(Exception e) {`

`System.out.println(``"发送 POST 请求出现异常!"``+e);`

`e.printStackTrace();`

`}`

`//使用finally块来关闭输出流、输入流`

`finally``{`

`try``{`

`if``(out!=``null``){`

`out.close();`

`}`

`if``(in!=``null``){`

`in.close();`

`}`

`}`

`catch``(IOException ex){`

`ex.printStackTrace();`

`}`

`}`

`return` `result;`

`}`

`}`

实例演示

在搭建flask框架文章中,我们已经写好了一个功能模块show(). 该功能模块如下:

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

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

`//创建发起http请求对象`

`HttpRequest h =` `new` `HttpRequest();`

`//向121.41.111.94/show发起POST请求,并传入name参数`

`String content = h.sendPost(``"[http://121.41.111.94/show](http://121.41.111.94/show)"``,``"name=张新宇"``);`

`System.out.println(content);  `

我们打印出content值,发现就是python中show()返回的json(在Java中,content被识别为String类型,而不是json)



(在转换过程中,不知道出什么问题了,中文显示了unicode编码。但在后面的转json格式后就没有这样的问题了)

字符串转json

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

   <dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.28</version>
</dependency>

转换代码如下:

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

运行结果:



结束
以上就是Java发起http请求,从而调用由python编写的功能模块。在使用python编写功能模块时,可以返回json格式的数据。在之后使用Java进行调用时,使用工具进行转换得出需要的数据。

到此这篇关于Java发起http请求的完整步骤记录的文章就介绍到这了,更多相关Java发起http请求内容请关注小编以前的文章或加私信小编备注(资料)希望大家以后多多支持小编!

相关推荐

数控系统常见术语详解,机加工人士必备资料
数控系统常见术语详解,机加工人士必备资料

增量编码器(Incrementpulsecoder)回转式位置测量元件,装于电动机轴或滚珠丝杠上,回转时发出等间隔脉冲表示位移量。由于没有记忆元件,故不能准...

2023-09-24 17:42 xiyangw

功、功率、扭矩的关系

功=功率×时间work=power×timeW=P×T功=力×距离work=force×lengthW=F×LP×T=F×LP=F×L/T=F×V(velocity)具体到电机输出轴上,圆...

Wi-Fi协议(802.11 )常见专业术语汇总
Wi-Fi协议(802.11 )常见专业术语汇总

Wi-Fi协议(802.11)常见专业术语汇总AP(Accesspoint的简称,即访问点,接入点):是一个无线网络中的特殊节点,通过这个节点,无线网络中的...

2023-09-24 17:41 xiyangw

不需要策略模式也能避免满屏if/else
不需要策略模式也能避免满屏if/else

满屏if/elsejava复制代码publicstaticvoidmain(String[]args){inta=1;if...

2023-09-24 17:41 xiyangw

喜极而泣,我终于干掉了该死的 if-else
喜极而泣,我终于干掉了该死的 if-else

推荐阅读:面试淘宝被Tomcat面到“自闭”,学习这份文档之后“吊打”面试官刷完spring+redis+负载均衡+netty+kafka面试题,再去面试BAT...

2023-09-24 17:40 xiyangw

Python中使用三元运算符简化if-else语句
Python中使用三元运算符简化if-else语句

Python是一种极简主义的编程语言,相比其他编程语言,在多个地方简化了代码的写法,可以让我们用更少的时间更简洁地完成工作。以赋值运算符为例:a=a+b简化...

2023-09-24 17:40 xiyangw

雅思课堂 | 雅思口语写作句型第二讲
雅思课堂 | 雅思口语写作句型第二讲

纯干货,无废话用最少的时间学最制胜的内容!泡图书馆泡不过学霸?碎片时间也能弯道超车!向着雅思8分行动起来吧!雅思口语写作句型1.Ipreferseeing...

2023-09-24 17:39 xiyangw

设计模式(三)——简单的状态模式代替if-else
设计模式(三)——简单的状态模式代替if-else

博主将会针对Java面试题写一组文章,包括J2ee,SQL,主流Web框架,中间件等面试过程中面试官经常问的问题,欢迎大家关注。一起学习,一起成长。前言大多数开...

2023-09-24 17:38 xiyangw

如何优化代码中大量的if/else,switch/case?

前言随着项目的迭代,代码中存在的分支判断可能会越来越多,当里面涉及到的逻辑比较复杂或者分支数量实在是多的难以维护的时候,我们就要考虑下,有办法能让这些代码变得更优雅吗?正文使用枚举这里我们简单的定义一...

优秀程序员早就学会用“状态模式”代替if-else了
优秀程序员早就学会用“状态模式”代替if-else了

2020年已经进入倒计时了,大家立好的flag完成了吗?2020实“鼠”不易,希望2021可以“牛”转乾坤。简介状态模式是行为型设计模式的一种。其设计理念是当对...

2023-09-24 17:37 xiyangw

用Select Case语句对执行多条件进行控制
用Select Case语句对执行多条件进行控制

今日的内容是"VBA之EXCEL应用"的第六章"条件判断语句(If...Then...Else)在VBA中的利用"。这讲是第三节...

2023-09-24 17:37 xiyangw

c#入门教程(四)条件判断if else

条件判断,是编程里常用的判断语句,比如某个代码如果满足条件就执行a代码块否则就执行b代码块。案例1:inti=2*5;if(a>0){执行a代码块}elseif(a<0){执行b代码块...

每日学编程之JAVA(十一)—条件语句(if……else)

一个if语句包含一个布尔表达式和一条或多条语句。如果布尔表达式的值为true,则执行if语句中的代码块,否则执行if语句块后面的代码。if语句后面可以跟else语句,当if语句...

不需要策略模式也能避免满屏if/else

除了使用策略模式以外,还可以使用其他设计模式来避免满屏if/else的问题。以下是一些可能的解决方案:工厂模式:将if/else语句移到工厂类中,由工厂类负责创建对象。这样可以将if/else语句从客...

围绕ifelse与业务逻辑的那些梗
围绕ifelse与业务逻辑的那些梗

ifelse很重要,几乎是程序员编程核心,业务逻辑与规则也通过ifelse体现出来,语句简单但是背后文章很大,先看几则幽默图:1.也许默认使用returnf...

2023-09-24 17:36 xiyangw

取消回复欢迎 发表评论: