java 实现 HTTP请求(GET、POST)的方法

  使用Java进行服务调用时,避免不了要使用模拟HTTP请求来实现模拟,我在开发过程中恰巧遇到了这类的业务需求,所以就对这类的方法进行了一次总结,原理层次的东西暂时不考虑,毕竟HTTP的底层实现啥的,东西挺多且挺复杂的,对我的项目而言,理解这些东西并不能从直观上得到很明显的提升或帮助,还是代码来的比较实在,so,贴出几种方法的总结,用作备份,免的日后再重复造轮子。

第一种:白痴方案,最原始的解决方案,功能暂时是实现了,但是里面会涉及到通用性和性能等的问题,暂时不考虑,代码如下

public class HttpRequest {

    private static final Logger LOGGER = LoggerFactory.getLogger(HttpRequest.class.getName());

    /**
     * 向指定URL发送GET方法的请求
     *
     * @param url   发送请求的URL
     * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
     * @return URL 所代表远程资源的响应结果
     */
    public static String sendGet(String url, String param) {
        StringBuilder result = new StringBuilder();
        BufferedReader bufferedReader = 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()) {
                LOGGER.info("key : {}", map.get(key));
                System.out.println(key + "--->" + map.get(key));
            }
            // 定义 BufferedReader输入流来读取URL的响应
            bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                result.append(line);
            }
        } catch (Exception e) {
            LOGGER.error("HTTP GET error : {}", e.getMessage());
        }
        // 使用finally块来关闭输入流
        finally {
            try {
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return result.toString();
    }

    /**
     * 向指定 URL 发送POST方法的请求
     *
     * @param url   发送请求的 URL
     * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
     * @return 所代表远程资源的响应结果
     */
    public static String sendPost(String url, String param) {
        LOGGER.info("url : {}", url);
        LOGGER.info("param : {}", param);
        PrintWriter out = null;
        BufferedReader in = null;
        StringBuilder result = new StringBuilder();
        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)");
            conn.setRequestProperty("accept-language", "en-US,en;q=0.5");
            // 发送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.append(line);
            }
        } catch (Exception e) {
            LOGGER.error("HTTP POST error : {}", e.getMessage());
        }
        //使用finally块来关闭输出流、输入流
        finally {
            try {
                if (out != null) out.close();
                if (in != null) in.close();
            } catch (IOException ex) {
                LOGGER.error("close IO error : {}", ex.getMessage());
            }
        }
        return result.toString();
    }
}

第二种:升级版本,基于上个版本进行的简化版,看起来更简洁一些,代码如下

public class HttpClientUtil {

    private static final Logger LOGGER = LoggerFactory.getLogger(HttpClientUtil.class.getName());

    public static String sendGet(String url, String param) throws IOException {
        LOGGER.info("request url info : {}", url);
        HttpGet request = new HttpGet(url + "?" + param);
        return send(request);
    }

    public static String sendPost(String url, String param) throws IOException {
        LOGGER.info("request url info : {}", url);
        HttpPost request = new HttpPost(url);
        request.setEntity(
                new StringEntity(param, ContentType.create("application/json;charset=UTF-8"))
        );
        return send(request);
    }

    private static String send(HttpRequestBase request) throws IOException {
        String message = "";
        request.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) ...");
        request.setHeader("accept", "*/*");
        request.setHeader("connection", "Keep-Alive");
        CloseableHttpClient httpclient = HttpClients.createDefault();
        CloseableHttpResponse response = httpclient.execute(request);
        HttpEntity entity = response.getEntity();
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        if (entity != null) {
            long length = entity.getContentLength();
            if (length != -1 && length < 2048) {
                message = EntityUtils.toString(entity);
            } else {
                InputStream in = entity.getContent();
                byte[] data = new byte[4096];
                int count;
                while ((count = in.read(data, 0, 4096)) != -1) {
                    outStream.write(data, 0, count);
                }
                message = new String(outStream.toByteArray(), "UTF-8");
            }
        }
        LOGGER.info(">>>>>>>>>>>>>>>>>response message info : {}", message);
        return message;
    }
}

第三种:这一种方案,彻底告别了傻瓜式的轮子创造过程,直接使用开源的,已封装好的代码工具来实现这一过程,但是有个问题就是,他会产生轮询日志,以此保持链接通讯,如果看着不爽,可以改源码里的配置,或者使用log4j2中的日志过滤器,直接将他的日志过滤掉,并只打印程序的日志信息,看起来更清爽一些,代码如下(PS:这个工具包全方位支持RESFUL请求方式,这里只列举常用的两种,其他的请自行实验)

public class UnirestUtil {

    private static final Logger LOGGER = LoggerFactory.getLogger(UnirestUtil.class.getName());

    /**
     *
     * @param url 目标url
     * @param name 参数名称
     * @param param 请求参数
     * @return 网络传输状态码或请求结果
     */
    public static HttpResponse sendGet(String url, String name, String param) throws UnirestException {
        LOGGER.debug("request url info : {}", url);
        HttpResponse<String> response = Unirest.get(url)
                .header("accept", "application/json;charset=UTF-8")
                .queryString(name, param)
                .asString();
        LOGGER.debug("response status info : {}", response.getStatus());
        LOGGER.debug("response status message info : {}", response.getStatusText());
        return response;
    }

    /**
     *
     * @param url 目标url
     * @param name 参数名称
     * @param param 请求参数实体
     * @return 网络传输状态码
     */
    public static HttpResponse sendPost(String url, String name, String param) throws UnirestException {
        LOGGER.debug("request url info : {}", url);
        HttpResponse<String> response = Unirest.post(url)
                .header("accept", "application/json;charset=UTF-8")
                .queryString(name, param)
                .asString();
        LOGGER.debug("response status info : {}", response.getStatus());
        LOGGER.debug("response status message info : {}", response.getStatusText());
        return response;
    }
}

OK,至此,几种方案都贴出来了,可能还有更简洁可靠的方案来实现这个功能,但是我还没找到,如果您有更好的方法,请留言交流,分享出来吧,谢谢。

时间: 2024-08-19 13:21:44

java 实现 HTTP请求(GET、POST)的方法的相关文章

JAVA实现HTTP请求的方法

目前JAVA实现HTTP请求的方法用的最多的有两种: 第一种是java原生HttpURLConnection import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import jav

【Servlet】深入浅出Java重定向和请求转发

import java.text.*; import java.util.*; import java.io.*; import javax.servlet.http.*; import javax.servlet.*; import com.bjpowernode.exam.model.*; import com.bjpowernode.exam.manager.*; public class SearchStudentServlet extends HttpServlet { public

Java实现ping功能的三种方法

Java实现ping功能的三种方法 检测设备的运行状态,有的是使用ping的方式来检测的.所以需要使用java来实现ping功能. 为了使用java来实现ping的功能,有人推荐使用java的 Runtime.exec()方法来直接调用系统的Ping命令,也有人完成了纯Java实现Ping的程序,使用的是Java的NIO包(native io, 高效IO包).但是设备检测只是想测试一个远程主机是否可用.所以,可以使用以下三种方式来实现: 1.Jdk1.5的InetAddresss方式 自从Jav

java模拟post请求发送json

java模拟post请求发送json,用两种方式实现,第一种是HttpURLConnection发送post请求,第二种是使用httpclient模拟post请求, 方法一: 1 package main.utils; 2 3 import java.io.*; 4 import java.net.HttpURLConnection; 5 import java.net.URL; 6 7 public class HttpUtilTest { 8 Log log = new Log(this.g

java 实现https请求

java 实现https请求 JSSE是一个SSL和TLS的纯Java实现,通过JSSE可以很容易地编程实现对HTTPS站点的访问.但是,如果该站点的证书未经权威机构的验证,JSSE将拒绝信任该证书从而不能访问HTTPS站点.本文在简要介绍JSSE的基础上提出了两种解决该问题的方法. 引言 过去的十几年,网络上已经积累了大量的Web应用.如今,无论是整合原有的Web应用系统,还是进行新的Web开发,都要求通过编程来访问某些Web 页面.传统的方法是使用Socket接口,但现在很多开发平台或工具如

Java Web之请求和响应

Servlet最主要作用就是处理客户端请求并作出回应,为此,针对每次请求,Web容器在调用service()之前都会创建两个对象,分别是HttpServletRequest和HttpServletResponse.其中HttpServletRequest封装HTTP请求消息,HttpServletResponse封装HTTP响应消息.需要注意的是,Web服务器运行过程中,每个Servlet都会只创建一个实例对象,不过每次请求都会调用Servlet实例的service(ServletRequest

java 模拟http请求

整理一下用java模拟http请求的方法,如果有不正确的地方希望大家指正,如果大家有什么更好的方法欢迎提出 1.URLConnection可以向URL地址发送请求,读取URL的资源.建立和URL的连接通常需要一下几步: 创建URL对象,并通过调用openConnection方法获得URLConnection对象: 设置URLConnection参数和普通请求属性: 向远程资源发送请求: 远程资源变为可用,程序可以访问远程资源的头字段和通过输入流来读取远程资源返回的信息. import java.

关于java获取本地ip的几种方法

关于java获取本地ip的几种方法1.获取本地ip的方法 System.out.println(InetAddress.getLocalHost().getHostAddress()); 2.域名解析ip的方法 System.out.println(InetAddress.getByName("www.sina.com.cn")); 3.获取本地出口ip的方法(局域网NAT或本地找交换机出口ip的方法) 建立通讯TCP,telnet,mina通讯等. Socket client = n

详解java垃圾回收机制(转)及finalize方法(转)

详细介绍Java垃圾回收机制 垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机制并未改变.垃圾收集的目的在于清除不再使用的对象.GC通过确定对象是否被活动对象引用来确定是否收集该对象.GC首先要判断该对象是否是时候可以收集.两种常用的方法是引用计数和对象引用遍历. 引用计数收集器 引用计数是垃圾收集器中的早期策略.在这种方法中,堆中每个对象(不是

java如果去请求一个网页的数据

我们可以通过在java程序中模拟浏览器一样,把数据抓下来,具体方法是在java程序中set header和cookie,下面是一个例子: public class NetConnection { public static final int MAX_HOTWORDS_FILE_SIZE = 256 * 1024; public static void main(String[] args) { send("http://tuan.aibang.com/shenzhen/new_2033549.