自动化框架httpClient实例
package com.auto.test.util;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
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.HttpClientBuilder;
import org.apache.http.impl.execchain.RequestAbortedException;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
*
* 2016年9月12日下午8:37:22
*/
public class HttpRequest {
private final static Logger logger=LoggerFactory.getLogger(HttpRequest.class);
private static final CloseableHttpClient httpClient;
static{
RequestConfig config=RequestConfig.custom().setConnectTimeout(60000).setSocketTimeout(15000).build();
httpClient=HttpClientBuilder.create().setDefaultRequestConfig(config).build();
}
public static final String CHARSET_utf="utf-8";
public static final String CHARSET_gbk = "GBK";
/**
* HTTP Post 获取内容
*
* @param url 请求的url地址 ?之前的地址
* @param params 表单参数
* @param heads 请求的头
* @param charset 编码格式
* @return 页面内容
*/
public static String doPostFormWithHeader(String url, Map<String, Object> params, Map<String, String> heads, String charset) {
if (StringUtils.isBlank(url)) {
return null;
}
System.out.println(url);
try {
HttpPost httpPost = new HttpPost(url);
List<NameValuePair> pairs = null;
if (params != null && !params.isEmpty()) {
pairs = new ArrayList<NameValuePair>(params.size());
for (Map.Entry<String, Object> entry : params.entrySet()) {
String value = entry.getValue().toString();
if (value != null) {
pairs.add(new BasicNameValuePair(entry.getKey(), value));
}
}
}
if (pairs != null && pairs.size() > 0) {
httpPost.setEntity(new UrlEncodedFormEntity(pairs, CHARSET_utf));
}
if (heads != null) {
for (Entry<String, String> e : heads.entrySet()) {
httpPost.addHeader(e.getKey(), e.getValue());
}
}
CloseableHttpResponse response = httpClient.execute(httpPost);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode != 200) {
httpPost.abort();
throw new RuntimeException("HttpClient,error status code :" + statusCode);
}
HttpEntity entity = response.getEntity();
String result = null;
if (entity != null) {
result = EntityUtils.toString(entity, "utf-8");
}
EntityUtils.consume(entity);
response.close();
return result;
} catch (Exception e) {
if (e instanceof RequestAbortedException || e instanceof SocketTimeoutException || e instanceof SocketException) {
try {
Thread.sleep(30000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return doPostFormWithHeader(url, params, heads, charset);
}
e.printStackTrace();
}
return null;
}
/**
* HTTP Post 获取内容
*
* @param params 请求的实体数据,非表单参数
* @param heads 请求的头
* @param charset 编码格式
* @return 页面内容
*/
public static String doPostBody(String urlInit, Map<String, Object> params, Map<String, String> heads, String charset) {
if (StringUtils.isBlank(urlInit)) {
return null;
}
// String url = urlInit + "?ticket=" + heads.get("ticket");
String url = urlInit;
try {
HttpPost httpPost = new HttpPost(url);
if (params != null && !params.isEmpty()) {
logger.info("[相关http参数]-"+JsonParse.map2Json(params));
StringEntity myEntity = new StringEntity(JsonParse.map2Json(params), charset);
httpPost.setEntity(myEntity);
}
if (heads != null) {
for (Entry<String, String> e : heads.entrySet()) {
httpPost.addHeader(e.getKey(), e.getValue());
}
}
CloseableHttpResponse response = httpClient.execute(httpPost);
HttpEntity entity = response.getEntity();
String result = null;
if (entity != null) {
result = EntityUtils.toString(entity, "utf-8");
}
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode != 200) {
logger.info("【URL】-" + url);
logger.info("[返回结果]-" + result);
httpPost.abort();
// throw new RuntimeException("HttpClient,error status code :" + statusCode);
logger.error("HttpClient,error status code :" + statusCode);
return result;
}
if (!JsonParse.getFromKey("ResultCode", result).equals("0")) {
logger.info("[返回结果]-" + result);
}
EntityUtils.consume(entity);
response.close();
return result;
} catch (Exception e) {
if (e instanceof RequestAbortedException || e instanceof SocketTimeoutException || e instanceof SocketException) {
try {
Thread.sleep(30000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return doPostBody(url, params, heads, charset);
}
e.printStackTrace();
}
return null;
}
}
自动化框架httpClient实例的更多相关文章
- ASP.NET Core 6框架揭秘实例演示[17]:利用IHttpClientFactory工厂来创建HttpClient
在一个采用依赖注入框架的应用中,我们一般不太推荐利用手工创建的HttpClient对象来进行HTTP调用,使用的HttpClient对象最好利用注入的IHttpClientFactory工厂来创建.前 ...
- ASP.NET Core 6框架揭秘实例演示[18]:HttpClient处理管道
我们知道ASP.NET的核心就是由中间件组成的请求处理管道,HttpClient也采用了类似的设计.HttpClient管道由一组HttpMessageHandler对象构成,这些HttpMessag ...
- python+requests接口自动化框架
为什么要做接口自动化框架 1.业务与配置的分离 2.数据与程序的分离:数据的变更不影响程序 3.有日志功能,实现无人值守 4.自动发送测试报告 5.不懂编程的测试人员也可以进行测试 正常接口测试的流程 ...
- CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维
前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...
- 接口自动化:HttpClient + TestNG + Java(二) - 第一个接口测试:get请求
在上一篇中,我们搭建好了HttpClient + TestNG + Java的自动化接口测试环境,这一篇我们就赶紧开始编写我们的第一个接口测试用例. 本篇会对问题解决的思路进行更详尽的阐述. 2.1 ...
- 接口自动化框架(Pytest+request+Allure)
前言: 接口自动化是指模拟程序接口层面的自动化,由于接口不易变更,维护成本更小,所以深受各大公司的喜爱. 接口自动化包含2个部分,功能性的接口自动化测试和并发接口自动化测试. 本次文章着重介绍第一种, ...
- ShutIt:一个基于 Python 的 shell 自动化框架
ShutIt是一个易于使用的基于shell的自动化框架.它对基于python的expect库(pexpect)进行了包装.你可以把它看作是“没有痛点的expect”.它可以通过pip进行安装. Hel ...
- ui自动化笔记 selenium_webdriver,ui自动化框架(web)
Selenium学习笔记 selenium webdriver是业界公认ui自动化测试的标准,其封装的api可以对浏览器的任何地方进行操作 selenium2.0和selenium3.0的区别? 3. ...
- Jmeter+ant+Jenkins接口自动化框架搭建
摘自:https://testerhome.com/topics/13389 一.背景 上一篇讲了Jmeter 接口自动化-脚本数据分离实例,我们知道怎么利用Jmeter去编写接口自动化脚本,但是接 ...
随机推荐
- PAT 天梯赛 L1-032. Left-pad 【字符串】
题目链接 https://www.patest.cn/contests/gplt/L1-032 思路 要分两种情况处理 ①字符串长度 <= 填充长度 就在字符串前面输出(填充长度 - 字符串长度 ...
- ajax数据请求的理解
一,请求 发送请求有两种方式:get 跟 post . 1.get仅请求数据,不需要服务端做处理,最后会返回指定的资源. 2.post可以提交数据,服务端根据提交的数据做处理,再返回数据. 二,创建X ...
- Python学习进程(10)字典
本节介绍Python中的字典:是另一种可变容器模型,且可存储任意类型对象. (1)字典简介: 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割 ...
- 财经世界(2)A股B股和H股
在发行过程中,公司通过章程给不同股份形式赋予不同的权益,使公司股份出现A股.B股等形式.我国上市公司的股票有A股.B股.H股.N股.S股等的区分.这一区分的主要依据股票的上市地点和所面对的投资者而定. ...
- PHP领域类型Java中ibatis的API
最近公司技术调整,要把java用php换掉,其中java主要的工作就是查询数据库,并返回json,ORM用的是ibatis,主要用到了Object映射和动态SQL,组员们用的都挺6,转到PHP后,发现 ...
- java PinYinUtils 拼音工具类
package com.sicdt.library.core.utils; import java.util.HashSet; import java.util.Set; import net.sou ...
- Ag-grid控件使用pine:left后,配合iview下拉框,会出现闪烁
Ag-grid控件使用pinned:left后,配合iview下拉框,会出现闪烁 引起原因:下拉图标的反转动画 目前解决方案: 添加一个全局样式: 禁用动画,其他地方也是如此, 影响控件有:gz-tr ...
- Python编程-继承和接口
一.继承 1.什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类. 继承的好处: 可以使用现有类的所有功能,并在无 ...
- linux环境下的python安装过程(含setuptools)
这里我不想采用诸如ubuntu下的apt-get install方式进行python的安装,而是在linux下采用源码包的方式进行python的安装. 一.下载python源码包 打开ubuntu下的 ...
- mapreduce实现学生平均成绩
思路: 首先从文本读入一行数据,按空格对字符串进行切割,切割后包含学生姓名和某一科的成绩,map输出key->学生姓名 value->某一个成绩 然后在reduce里面对成绩进行遍历 ...