Java如何发起http请求

时间:2021-2-26 作者:admin

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","name=张新宇");
       System.out.println(content);         

我们打印出content值,发现就是python中show()返回的json(在Java中,content被识别为String类型,而不是json)
Java如何发起http请求
(在转换过程中,不知道出什么问题了,中文显示了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请求

结束

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

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。