工具类 | JAVA发送HTTP请求,并接受返回内容

转自:https://blog.csdn.net/liupeifeng3514/article/details/80103572 


/**
 * Copyright 2017
 * 注意:请勿修改
 * All right reserved.
 */

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import java.util.Map.Entry;

/**
 * @Name: HttpRequest.java
 * @Description: Java后台访问http,并获得响应数据。
 * @Author: PeiFeng
 * @Create Date: 2017-8-9
 */
public final class HttpRequest {

    // ;charset=utf-8 必须要,不然会出现乱码
    /**
     * 表单数据 <br/>
     * <br/>
     * 在发送前编码所有字符(默认)<br/>
     * <br/>
     * application/x-www-form-urlencoded;charset=utf-8
     */
    public static String CONTENT_TYPE_FORM_URLENCODED = "application/x-www-form-urlencoded;charset=utf-8";

    /**
     * 表单数据 <br/>
     * <br/>
     * 不对字符编码。在使用包含文件上传控件的表单时,必须使用该值 <br/>
     * <br/>
     * multipart/form-data;charset=utf-8
     */
    public static String CONTENT_TYPE_FORM_DATA = "multipart/form-data;charset=utf-8";

    /** text/plain;charset=utf-8 */
    public static String CONTENT_TYPE_PLAIN = "text/plain;charset=utf-8";
    /** application/json;charset=utf-8 */
    public static String CONTENT_TYPE_JSON = "application/json;charset=utf-8";

    /**
     * @Name: post。
     * @Description: 发送post请求,并返回响应数据。
     * @Parameters: URL,要访问的url。
     * @Parameters: parms,访问参数,Map形式。
     * @Return: String,响应数据。
     * @Author: PeiFeng
     * @Version: V1.00
     * @Create Date: 2017-8-8
     */
    public static String post(String URL, Map<String, String> params) {
        StringBuilder parm = new StringBuilder();
        if (params != null && !params.isEmpty()) {
            for (Entry<String, String> entry : params.entrySet()) {
                parm.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
            }
        }
        return post(URL, parm.toString());
    }

    /**
     * @Name: post。
     * @Description: 发送post请求,并返回响应数据。
     * @Parameters: URL,要访问的url。
     * @Parameters: parm,访问参数。
     * @Return: String,响应数据。
     * @Author: PeiFeng
     * @Version: V1.00
     * @Create Date: 2017-8-8
     */
    public static String post(String URL, String parm) {

        HttpURLConnection conn = null;
        // 数据输出流,输出参数信息
        DataOutputStream dataOut = null;
        // 数据输入流,处理服务器响应数据
        BufferedReader dataIn = null;

        try {
            URL url = new URL(URL);

            // 将url以open方法返回的urlConnection连接强转为HttpURLConnection连接(标识一个url所引用的远程对象连接)
            // 此时cnnection只是为一个连接对象,待连接中
            conn = (HttpURLConnection) url.openConnection();

            // 设置连接输出流为true,默认false (post请求是以流的方式隐式的传递参数)
            conn.setDoOutput(true);
            // 设置连接输入流为true
            conn.setDoInput(true);
            // 设置请求方式为post
            conn.setRequestMethod("POST");
            // post请求缓存设为false
            conn.setUseCaches(false);
            // 设置该HttpURLConnection实例是否自动执行重定向
            conn.setInstanceFollowRedirects(true);

            // 设置内容的类型,设置为经过urlEncoded编码过的from参数
            conn.setRequestProperty("Content-Type", HttpRequest.CONTENT_TYPE_FORM_URLENCODED);
            conn.setRequestProperty("accept", "*/*");
            // conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible;
            // MSIE 6.0; Windows NT 5.1;SV1)");

            // 建立连接
            // (请求未开始,直到connection.getInputStream()方法调用时才发起,以上各个参数设置需在此方法之前进行)
            conn.connect();

            // 创建输入输出流,用于往连接里面输出携带的参数,(输出内容为?后面的内容)
            dataOut = new DataOutputStream(conn.getOutputStream());
            // 将参数输出到连接
            dataOut.writeBytes(parm != null ? parm : "");
            // 输出完成后刷新并关闭流
            dataOut.flush();

            //输出连接信息,实际使用时去掉
            outConnInfo(conn, url);

            // 连接发起请求,处理服务器响应 (从连接获取到输入流并包装为bufferedReader)
            dataIn = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
            String line;
            // 用来存储响应数据
            StringBuilder sb = new StringBuilder();
            // 循环读取流
            while ((line = dataIn.readLine()) != null) {
                sb.append(line).append(System.getProperty("line.separator"));
            }
            return sb.toString();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // 重要且易忽略步骤 (关闭流,切记!)
                if (dataOut != null) {
                    dataOut.close();
                }
                if (dataIn != null) {
                    dataIn.close();
                }
                // 销毁连接
                if (conn != null) {
                    conn.disconnect();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    /**
     * @Name: get。
     * @Description: 发送get请求,并返回响应数据。
     * @Parameters: URL,要访问的url。
     * @Return: String,响应数据。
     * @Author: PeiFeng
     * @Version: V1.00
     * @Create Date: 2017-8-8
     */
    public static String get(String URL) {

        HttpURLConnection conn = null;
        BufferedReader dataIn = null;

        try {
            // 把字符串转换为URL请求地址
            URL url = new URL(URL);
            // 打开连接
            conn = (HttpURLConnection) url.openConnection();
            // 连接会话
            conn.connect();
            // 获取输入流
            dataIn = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
            String line;
            StringBuilder sb = new StringBuilder();
            while ((line = dataIn.readLine()) != null) {// 循环读取流
                sb.append(line);
            }
            return sb.toString();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // 重要且易忽略步骤 (关闭流,切记!)
                if (dataIn != null) {
                    dataIn.close();
                }
                // 销毁连接
                if (conn != null) {
                    conn.disconnect();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    /** 输出连接信息 */
    private static void outConnInfo(HttpURLConnection conn, URL url) throws IOException {
        // url与url = conn.getURL()是等价的
        System.out.println("conn.getResponseCode():" + conn.getResponseCode());
        System.out.println("conn.getURL():" + conn.getURL());
        System.out.println("conn.getRequestMethod():" + conn.getRequestMethod());
        System.out.println("conn.getContentType():" + conn.getContentType());
        System.out.println("conn.getReadTimeout():" + conn.getReadTimeout());
        System.out.println("conn.getResponseMessage():" + conn.getResponseMessage());
        System.out.println("url.getDefaultPort():" + url.getDefaultPort());
        System.out.println("url.getFile():" + url.getFile());
        System.out.println("url.getHost():" + url.getHost());
        System.out.println("url.getPath():" + url.getPath());
        System.out.println("url.getPort():" + url.getPort());
        System.out.println("url.getProtocol():" + url.getProtocol());
        System.out.println("url.getQuery():" + url.getQuery());
        System.out.println("url.getRef():" + url.getRef());
        System.out.println("url.getUserInfo():" + url.getUserInfo());
    }

    public static void main(String[] args) {
        String result = post("https://blog.csdn.net/liupeifeng3514", "");
        System.out.println("\n" + result);
    }
}

输出结果: 

conn.getResponseCode():200
conn.getURL():https://blog.csdn.net/liupeifeng3514
conn.getRequestMethod():POST
conn.getContentType():text/html; charset=UTF-8
conn.getReadTimeout():0
conn.getResponseMessage():OK
url.getDefaultPort():443
url.getFile():/liupeifeng3514
url.getHost():blog.csdn.net
url.getPath():/liupeifeng3514
url.getPort():-1
url.getProtocol():https
url.getQuery():null
url.getRef():null
url.getUserInfo():null

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <link rel="canonical" href="https://blog.csdn.net/liupeifeng3514"/> 
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="referrer" content="always">
    <meta name="description" content="" />
    <meta name="keywords" content="" />
    <meta http-equiv="Cache-Control" content="no-siteapp" /><link rel="alternate" media="handheld" href="#" />
    <meta name="shenma-site-verification" content="5a59773ab8077d4a62bf469ab966a63b_1497598848">
    <link href="https://csdnimg.cn/public/favicon.ico" rel="SHORTCUT ICON">
    <title>挖坑埋你 - CSDN博客</title>

            <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/list-c591fcb538.min.css">
        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/themes/big-white/big-white-cda1f36f9e.min.css">

    <script type="text/javascript">
        var username = "liupeifeng3514";
        var blog_address = "https://blog.csdn.net/liupeifeng3514";
        var static_host = "https://csdnimg.cn/release/phoenix/";
        var currentUserName = ""; 
        var isShowAds = true;
        var isOwner = false;
        var loginUrl = "https://passport.csdn.net/account/login?from=https://blog.csdn.net/liupeifeng3514"
        var blogUrl = "https://blog.csdn.net/";
        var curSkin = "big-white";
    </script>
    <script type="text/javascript">
        // Traffic Stats of the entire Web site By baidu
        var _hmt = _hmt || [];
        (function() {
            var hm = document.createElement("script");
            hm.src = "https://hm.baidu.com/hm.js?6bcd52f51e9b3dce32bec4a3997715ac";

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值