前言

在未来做项目中,一些功能模块可能会采用不同的语言进行编写。这就需要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","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请求内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!