Java代码模拟一个Post请求

​ 我们常用的http请求无非GET和POST。在springboot项目中,我们如果想要测试一段代码无非就是项目跑起来,然后在浏览器中通过输入url,看浏览器中(按F12)控制台是否响应成功,以及看IDEA控制台的打印内容。

​ 但是在浏览器中输入url,GET请求很好模拟,无非是本机ip+服务端口+springboot项目中在controller层配置的@RequestMapping(“/访问路径”)。而POST请求就不是那么好模拟的了,因为POST请求一般包含参数,参数以JSON格式封装在请求体中,有其对应的请求头。那么POST请求该如何模拟呢?代码如下所示:

依赖:

        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.24</version></dependency>

这个依赖使用的目的是通过一个JSONObject的类封装我们的参数。然后剩下的依赖,在前面的HttpClient的学习笔记中有提到。

模拟Post请求代码如下:

import com.alibaba.fastjson.JSONObject;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.junit.Test;import java.io.IOException;public class PostTest {/*** 模拟Post请求,进行url测试*/@Testpublic void testPostRequest() {String url = "http://127.0.0.1:8081/business/user/record/query";//请求tiJSONObject parammap = new JSONObject();parammap.put("userid",123456);parammap.put("username", "xiaoming");parammap.put("appname", "myapp");parammap.put("queryDate","20220321");String str = doPost(url, parammap.toJSONString());// 输出响应内容System.out.println(str);}public String doPost(String url ,String json) {//创建httpclient对象CloseableHttpClient httpClient = HttpClients.createDefault();CloseableHttpResponse response = null;String res = "";try {// 创建 httppost请求HttpPost post = new HttpPost(url);// 创建请求内容StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);post.setEntity(entity);// 执行http请求response = httpClient.execute(post);res = EntityUtils.toString(response.getEntity(), "utf-8");} catch (IOException e) {e.printStackTrace();} finally {try {if (response != null) {response.close();}} catch (IOException e) {e.printStackTrace();}}return res;}}

更新:

将常用的get、post请求封装为一个工具类,代码如下:

import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;public final class HttpUtil {/*** 连接客户端*/private static final CloseableHttpClient HTTP_CLIENT;/*** 最大连接数*/private static final int MAX = 50;private HttpUtil() {}static {PoolingHttpClientConnectionManager manager = new PoolingHttpClientConnectionManager() {};manager.setMaxTotal(MAX);HTTP_CLIENT = HttpClients.custom().setConnectionManager(manager).build();}public static String httpGet(String url) throws IOException {HttpGet get = new HttpGet(url);try (CloseableHttpResponse response = HTTP_CLIENT.execute(get)) {return EntityUtils.toString(response.getEntity());}}public static String httpGet(String url, Map<String, String> headers) throws IOException {HttpGet get = new HttpGet(url);headers.forEach(get::addHeader);try (CloseableHttpResponse response = HTTP_CLIENT.execute(get)) {return EntityUtils.toString(response.getEntity());}}public static String httpPost(String url, Map<String, String> params, Map<String, String> headers)throws IOException {HttpPost post = new HttpPost(url);headers.forEach(post::addHeader);List<NameValuePair> parameters = new ArrayList<>();params.forEach((key, value) -> parameters.add(new BasicNameValuePair(key, value)));UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters, "utf-8");post.setEntity(entity);try (CloseableHttpResponse response = HTTP_CLIENT.execute(post)) {return EntityUtils.toString(response.getEntity());}}public static String httpPostJson(String url, String body, Map<String, String> headers) throws IOException {HttpPost post = new HttpPost(url);headers.forEach(post::addHeader);post.setEntity(new StringEntity(body, "utf-8"));try (CloseableHttpResponse response = HTTP_CLIENT.execute(post)) {return EntityUtils.toString(response.getEntity());}}}

Java代码模拟一个Post请求相关推荐

  1. Java代码模拟Redis

    Redis是C语言编写的NoSQL 存储形式是K->V 可以搭建集群(健壮) 相比memcached一个key对应的value最大只能存储1M而言Redis则十分慷慨可以支持1G(如果你内存足够 ...

  2. 如何设置Fiddler来拦截Java代码发送的HTTP请求,进行各种问题排查

    我们使用Java的RestTemplate或者Apache的HTTPClient编程的时候,经常遇到需要跟踪Java 代码发送的HTTP请求明细的情况.和javascript代码在浏览器里发送请求可以 ...

  3. java代码模拟大乐透

    java代码模拟大乐透 前区1-35随机5位不重复从小到大排列,后区1-12随机2位不重复从小到大排列 //模拟大乐透 public class DaLeTou {public static void ...

  4. java实现转账功能_如何利用Java代码模拟银行转账这一功能?

    今天是刘小爱自学Java的第70天. 感谢你的观看,谢谢你. 话不多说,开始今天的学习: 转账,相信基本都接触过,无论是线下用银行卡转账还是线上用手机转账,本质上都是差不多的. 一.转账案例 需要两个 ...

  5. 银行转账java mysql_如何利用Java代码模拟银行转账这一功能?

    今天是刘小爱自学Java的第70天. 感谢你的观看,谢谢你. 话不多说,开始今天的学习: 转账,相信大家基本都接触过,无论是线下用银行卡转账还是线上用手机转账,本质上都是差不多的. 一.转账案例 需要 ...

  6. 只用120行Java代码写一个自己的区块链

    区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大家都非常想了解这一切是如何工作的.这篇文章就是帮助你使用 Java 语言来实现一个简单的区块链,用不到 120 行代码来揭示区 ...

  7. 如何模拟一个XMLHttpRequest请求用于单元测试——nise源码阅读与分析

    概述 在我们进行单元测试的过程中,如果我们需要对一些HTTP接口进行相关的业务测试,那么我们就需要来模拟HTTP请求的发送与响应,否则我们就无法完成测试的闭环. 目前,有许许多多的测试框架都提供了模拟 ...

  8. java基础总结(三十一)--利用java代码写出http请求的服务端与客户端代码

    来自https://www.cnblogs.com/Nouno/p/5719010.html java开发接口利用http协议传输数据 这个接口主要用来登录,java服务器提供一个接口,移动设备客户端 ...

  9. java 模拟网页_使用Java代码模拟网页登录(有例子程序)

    最近股票很火,打算研究用代码下载股票数据,于是我做了一个Java代码的模拟IE网页登录的程序, 登录新浪的股票页面并下载一些数据来分析, 基本原理是利用Java自带的HttpURLConnection ...

最新文章

  1. Facebook的加密货币即将到来会对整个加密货币领域意味着什么
  2. 搭建hadoop2.6.0 HA及YARN HA
  3. 迁移到阿里云后,NTKO控件报存word 报文件存取错误,请检查网络传输。
  4. 卷积神经网络的网络结构——以LeNet-5为例
  5. 倒计时 2 天 | 解锁生鲜电商的战“疫”秘密
  6. javascript中this
  7. hibernate的映射关系配置及对会话工厂的初始化。以及struts2写实例查询
  8. 函数防抖 和 函数节流
  9. SAP Spartacus里的@mixin visible-focus
  10. Linux 驱动层实现阻塞和非阻塞
  11. java线程池一创建就立马有线程了么_Java 线程池二之Executors创建的五种线程池及使用注意...
  12. Atiitt 日志技术的重大问题解决法 目录 1.1. 只想看某些日志,使用tag过滤法 1 1.2. 能方便清晰的列出某一业务(如支付)的完整的处理流程 业务tag 1 1.3. - NDC(N
  13. 企业系统软件你知道哪些?
  14. Linux环境下右键无法新建文档的解决方法——Ubuntu 16.x
  15. 搜图出处的软件_以图搜图搜gif图片出处来源的懒人小工具
  16. 触控板用不了,解决办法:
  17. 无源定位入门(三)AOA(2)测角代码(MUSIC和ROOT—MUSIC)
  18. jvm gc fullgc定位分析
  19. 微型计算机普遍使用的编码是什么,微型计算机中普遍使用的字符编码是什么吗...
  20. [C#] StringBuilder简介及使用方法

热门文章

  1. isdigit函数python 小数,Python Pandas Series.str.isdigit()用法及代码示例
  2. DOM总结(鼠标事件,操作标签属性)
  3. Fortinet 修复数据分析解决方案中的严重漏洞
  4. 微信小程序上拉加载流程
  5. 数据库审计系统的功能有哪些?
  6. 1、Android单元测试
  7. 普洱熟茶发霉时应该怎样处理?
  8. SpringBoot--->>>单元测试-->>断言 assertions
  9. 【洛谷】P1803 凌乱的yyy 题解
  10. C语言----实现二叉树先序,中序和后序遍历