java模拟简易Http的get和post请求

背景

  笔者做java web后台开发,经常需要和前端同学交互,由于前后台工作效率不一,总会有时间差,以前总时傻傻等待或是轮询:“喂,前端写好了没,交互一下”。之前也有师弟告诉我,火狐浏览器有自带模拟Http请求的插件,但是,作为一名程序猿,还是想通过代码自己写个工具类。于是乎,就有了HttpHelper。

设计

  get和post协议是web开发最常用的两种方式,两者传输数据的不用在于:get请求将数据拼接在url地址里,而post请求则将数据放在请求体里。于是在工具类里定义两个方法相应的去处理两种请求,再将两个方法相同的地方(请求头设定,数据解析)抽取出来,代码复用。笔者做的web项目前后台交互数据均用json格式,因此数据存储在Map中。

代码

package util;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**
 * Simulating Http Request
 * Created by Michael Wong on 2016/2/24.
 */
public class HttpHelper {

    private static final String GET_METHOD = "GET";

    private static final String POST_METHOD = "POST";

    private HttpHelper() {

    }

    /**
     * Get request
     * @param url
     * @param parameters
     * @return responseBody
     */
    public static String get(String url, Map<String, Object> parameters) {

        url = url + "?" + parseParameters(parameters);

        HttpURLConnection connection = null;

        try {
            URL httpUrl = new URL(url);
            connection = (HttpURLConnection) httpUrl.openConnection();
            connection.setRequestMethod(GET_METHOD);

            setRequestProperty(connection);

            connection.connect();

            return receiveResponse(connection);

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
        }

        return null;
    }

    /**
     * Post request
     * @param url
     * @param parameters
     * @return responseBody
     */
    public static String post(String url, Map<String, Object> parameters) {

        HttpURLConnection connection = null;
        BufferedWriter writer = null;

        try {
            URL httpUrl = new URL(url);
            connection = (HttpURLConnection) httpUrl.openConnection();
            connection.setRequestMethod(POST_METHOD);

            setRequestProperty(connection);

            writer = new BufferedWriter(
                    new OutputStreamWriter(connection.getOutputStream()));
            writer.write(parseParameters(parameters));
            writer.flush();

            return receiveResponse(connection);

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (writer != null) {
                    writer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (connection != null) {
                connection.disconnect();
            }
        }

        return null;
    }

    /**
     * Set Request Properties
     * @param connection HttpConnection
     */
    private static void setRequestProperty(HttpURLConnection connection) {
        connection.setRequestProperty("Accept", "application/json, text/javascript, */*; q=0.01");
        connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
        connection.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.8,en;q=0.6");
        connection.setRequestProperty("Connection", "keep-alive");
        connection.setRequestProperty("User-Agent", "Mozilla/5.0 " +
                "(Windows NT 6.1; WOW64) AppleWebKit/537.36 " +
                "(KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36");
        if (POST_METHOD.equals(connection.getRequestMethod())) {
            connection.setDoOutput(true);
        }
        connection.setDoInput(true);
    }

    /**
     * Parse parameters
     * @param parameters
     * @return parsed parameters
     */
    private static String parseParameters(Map<String, Object> parameters) {
        if (parameters == null) {
            return "";
        }
        StringBuilder result = new StringBuilder();
        Set<Map.Entry<String, Object>> set = parameters.entrySet();
        Iterator<Map.Entry<String, Object>> iterator = set.iterator();

        while (iterator.hasNext()) {
            Map.Entry<String, Object> entry = iterator.next();
            result.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
        }

        return result.substring(0, result.lastIndexOf("&"));
    }

    /**
     * Read input stream
     * @param connection Http Connection
     * @return response body
     * @throws IOException
     */
    private static String receiveResponse(HttpURLConnection connection) throws IOException {
        BufferedReader reader = new BufferedReader(
                new InputStreamReader(connection.getInputStream(), "UTF-8"));
        StringBuilder receivedContent = new StringBuilder(1024);
        String line = "";
        while((line = reader.readLine()) != null) {
            receivedContent.append(line);
        }
        reader.close();
        return receivedContent.toString();
    }

}

测试

public class HttpSimulation {

    @Test
    public void testSignInFromCubeMaster() {
        int userId = 5;

        String url = "http://localhost:8080/cube/user/signInFromCubeMaster";

        Map<String, Object> params = MapFactory.newHashMap();
        params.put("userId", userId);

        HttpHelper.get(url, params);

    }
}

结束语

  Beta版,简单请求使用没问题,难免有Bug,欢迎各路高手批评指正,代码已上传至Github,欢迎打星星。

时间: 2024-11-02 21:36:59

java模拟简易Http的get和post请求的相关文章

Java模拟生产者消费者问题

一.Syncronized方法详解 解决生产者消费这问题前,先来了解一下Java中的syncronized关键字. synchronized关键字用于保护共享数据.请大家注意"共享数据",你一定要分清哪些数据是共享数据,如下面程序中synchronized关键字保护的不是共享数据(其实在这个程序中synchronized关键字没有起到任何作用,此程序的运行结果是不可预先确定的).这个程序中的t1,t2是 两个对象(pp1,pp2)的线程.JAVA是面向对象的程序设计语言,不同的对象的数

java模拟而一个电话本操作

哈哈,大家平时都在使用电话本,下面使用java来模拟而一个简单的电话本吧... 首先给出联系人的抽象类 package net.itaem.po; /** * * 电话人的信息 * */ public class User { private String name; private String phoneNumber; private String companyName; private String email; private String address; private Strin

java模拟手动Telnet过程之需求说明和功能点说明

一.需求 (一)每五分钟查询一次交换机的连接情况: (二)每2.5分钟更新每栋楼的连接情况. 二.功能点 序号 功能点说明 待定 完成 未完成 完成时间 预计用时(min) 实际用时(min) 备注 1 登录口令加密以及解密         60     2 表的创建和IP以及口令写入数据库         10     3 java模拟手动Telnet交换机         90     4 获取目标字符串         30     5 表的创建与当前目标数据的写入         10

java模拟面试 试题

java 四类八种基本数据类型 第一类:整型 byte short int long 第二类:浮点型 float double 第三类:逻辑型 Boolean(取值为 true false) 第四类:字符型 char & 与 运算符. | 或 是java中的位运算符,对二进制进行计算,两位都是1返回1,否则返回0. ^ 异或 是java中的位运算符,对二进制进行计算,两位不同返回1,否则返回0. == 可以用来比较引用类型(比较的是虚地址),也可以用来比较基本数据类型(比较的是二进制). 值得注

Jsoup实现java模拟登陆

Jsoup实现java模拟登陆 1:如何获取cookies. 1.1:由于需要登录,故先模拟登陆时的那一个<form>,这里用map来装载变量名称,变量值. Map<String, String> map = new HashMap<String, String>(); map.put("username", username); map.put("pwd", md5.getMD5ofStr(password)); map.put

java 模拟简单搜索

Java 模拟简单搜索 实体类 package org.dennisit.entity; /** * * * @version : 1.0 * * @author : 苏若年 <a href="mailto:[email protected]">发送邮件</a> * * @since : 1.0 创建时间: 2013-4-8 下午04:51:03 * * @function: TODO * */ public class Medicine { private I

用java模拟发送post请求

package com.bytestream.practice.demo;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.URL;import java.net.URLConnection;

Java模拟实现百度文档在线浏览

Java模拟实现百度文档在线浏览 这个思路是我参考网上而来,代码是我实现. 采用Apache下面的OpenOffice将资源文件转化为pdf文件,然后将pdf文件转化为swf文件,用FlexPaper浏览. ok, A.下载OpenOffice (转换资源文件) B.下载JodConverter(调用OpenOffice) C.下载Swftools(Pdf2Swf) D.下载 FlexPaper(浏览swf文件) 这里我已经全部下载好了,大家只需要下载:http://down.51cto.com

基于JAVA的简易在线聊天系统,觉得挺自豪的一个项目

项目做的比较多,最近,做的一个项目:基于JAVA的简易在线聊天系统,感觉挺自豪的. 这个项目应用JAVA编程语言实现基于网络的文本交互软件的设计和实现,达到多客户端收发文本消息的交互操作.通过服务器端多线程地监控客户端的登陆和退出,实时接收客户端发出的消息并定向发送到指定客户端,以实现在线实时文本消息传输功能:当服务器端运行时,客户端可以随时登陆和退出:客户端登陆时可以设置个人信息,包括用户名和密码:保持一定的系统稳定性,客户端与服务器端的连接稳定. 这个“基于JAVA的简易在线聊天系统”是我在