HttpClient及有关jar包详解
- 格式:doc
- 大小:58.00 KB
- 文档页数:8
如何使⽤HttpClient来发送带客户端证书的请求,以及如何忽略掉对服务器端证书的校验最近要做客户端和服务器端的双向认证,在客户端向服务器端发送带证书的请求这⾥有⼀点问题,⽹上的例⼦⼤多都不太好使,于是找了github上httpclient源代码中的例⼦改造了⼀下,终于弄明⽩了下⾯先贴上我⾃⼰的代码(需要导⼊HttpClient等相关jar包),然后再说明import mons.io.IOUtils;import org.apache.http.HttpEntity;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.conn.ssl.SSLConnectionSocketFactory;import org.apache.http.conn.ssl.TrustSelfSignedStrategy;import org.apache.http.conn.ssl.TrustStrategy;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.ssl.SSLContexts;import org.apache.http.util.EntityUtils;import .ssl.SSLContext;import java.io.File;import java.io.FileInputStream;import java.security.KeyStore;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;/** Created with Intellij IDEA* USER: 焦⼀平* Date: 2016/5/8* Time: 1:10* To change this template use File | Settings | File Template*/public class SSLDemo {public static void main(String[] args) throws Exception {KeyStore keyStore = KeyStore.getInstance("PKCS12");keyStore.load(new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\jiaoyiping.p12")), "123456".toCharArray());SSLContext sslcontext = SSLContexts.custom()//忽略掉对服务器端证书的校验.loadTrustMaterial(new TrustStrategy() {@Overridepublic boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {return true;}})//加载服务端提供的truststore(如果服务器提供truststore的话就不⽤忽略对服务器端证书的校验了)//.loadTrustMaterial(new File("D:\\truststore.jks"), "123456".toCharArray(),// new TrustSelfSignedStrategy()).loadKeyMaterial(keyStore, "cmcc".toCharArray()).build();SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslcontext,new String[]{"TLSv1"},null,SSLConnectionSocketFactory.getDefaultHostnameVerifier());CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslConnectionSocketFactory).build();try {HttpGet httpget = new HttpGet("https://10.2.5.116/PnsReceiver/ReceiveMessage");System.out.println("Executing request " + httpget.getRequestLine());CloseableHttpResponse response = httpclient.execute(httpget);try {HttpEntity entity = response.getEntity();System.out.println(response.getStatusLine());System.out.println(IOUtils.toString(entity.getContent()));EntityUtils.consume(entity);} finally {response.close();}} finally {httpclient.close();}}}SSLContexts.custom() ⽅法返回⼀个 SSLContextBuilder实例,来构建SSLContext,下⾯是SSLContextBuilder的⽅法列表:其中:loadKeyMaterial()重载⽅法是加载客户端证书⽤的loadTrustMaterial()重载⽅法是加载服务器端相关信息⽤的(我们就是使⽤ loadTrustMaterial(TrustStrategy trustStrategy) ⽅法⾃⼰实现了⼀个信任策略,不对服务器端的证书进⾏校验),在⽣成HttpClient的时候,指定相应的 SSLSocketFactory,之后,使⽤这个HttpClient发送的GET请求和POST请求就⾃动地附加上了证书信息如果我们只需要忽略掉对服务器端证书的验证,⽽不需要发送客户端证书信息,在构建SSLContext的时候,只需要 loadTrustMaterial() 不需要 loadKeyMaterial()关于客户端证书的类型问题:我们导出的pfx或者P12后缀的⽂件都是pkcs12类型的,根据java的⽂档,我找到了KeyStore⽀持的三种类型,如下图:客户端如何只信任某个服务器端的证书信息会在之后的⽂章中写。
使⽤HttpClient实现⽂件的上传下载⽅法1 HTTPHTTP 协议可能是现在 Internet 上使⽤得最多、最重要的协议了,越来越多的 Java 应⽤程序需要直接通过 HTTP 协议来访问⽹络资源。
虽然在 JDK 的 包中已经提供了访问 HTTP 协议的基本功能,但是对于⼤部分应⽤程序来说,JDK 库本⾝提供的功能还不够丰富和灵活。
HttpClient ⽤来提供⾼效的、最新的、功能丰富的⽀持 HTTP 协议的客户端编程⼯具包,并且它⽀持HTTP 协议最新的版本和建议。
⼀般的情况下我们都是使⽤Chrome或者其他浏览器来访问⼀个WEB服务器,⽤来浏览页⾯查看信息或者提交⼀些数据、⽂件上传下载等等。
所访问的这些页⾯有的仅仅是⼀些普通的页⾯,有的需要⽤户登录后⽅可使⽤,或者需要认证以及是⼀些通过加密⽅式传输,例如HTTPS。
⽬前我们使⽤的浏览器处理这些情况都不会构成问题。
但是⼀旦我们有需求不通过浏览器来访问服务器的资源呢?那该怎么办呢?下⾯以本地客户端发起⽂件的上传、下载为例做个⼩Demo。
HttpClient有两种形式,⼀种是org.apache.http下的,⼀种是mons.httpclient.HttpClient。
2 ⽂件上传⽂件上传可以使⽤两种⽅式实现,⼀种是PostMethod⽅式,⼀种是HttpPost⽅式。
两者的处理⼤同⼩异。
PostMethod是使⽤FileBody将⽂件包装流包装起来,HttpPost是使⽤FilePart将⽂件流包装起来。
在传递⽂件流给服务端的时候,都可以同时传递其他的参数。
2.1 客户端处理2.1.1 PostMethod⽅式将⽂件封装到FilePart中,放⼊Part数组,同时,其他参数可以放⼊StringPart中,这⾥没有写,只是单纯的将参数以setParameter的⽅式进⾏设置。
此处的HttpClient是mons.httpclient.HttpClient。
常见jar包详解jar包⽤途axis.jar SOAP引擎包commons-discovery-0.2.jar⽤来发现、查找和实现可插⼊式接⼝,提供⼀些⼀般类实例化、单件的⽣命周期管理的常⽤⽅法.jaxrpc.jar Axis运⾏所需要的组件包saaj.jar创建到端点的点到点连接的⽅法、创建并处理SOAP消息和附件的⽅法,以及接收和处理SOAP错误的⽅法. wsdl4j-1.5.1.jar Axis运⾏所需要的组件包activation.jar JAF框架的jar包annotations-api.jar使⽤注解所需jarant.jar⽤于⾃动化调⽤程序完成项⽬的编译,打包,测试等aopalliance-1.0.jar⽀持Spring AOPasm-2.2.3.jar ASM字节码库asm-commons-2.2.3.jar ASM字节码库asm-util-2.2.3.jar Java字节码操纵和分析框架aspectjrt.jar处理事务和AOP所需的包aspectjweaver.jar处理事务和AOP所需的包axiom-api-1.2.7.jar Axis 对象模型axiom-impl-1.2.7.jar Axis 对象模型bcprov-jdk15-140.jar基于java1.5 的加密算法实现bfmclientmodel.jar使⽤WebSphere所需jar包bpcclientcore.jar使⽤WebSphere所需jar包bpe137650.jar提供远程访问BPE容器的实现。
bsh-2.0b4.jar解决负载逻辑运算c3p0-0.9.0.jar开放源代码的JDBC连接池cglib-nodep-2.1_3.jar Spring中⾃动代理所需jar包cobertura.jar测量测试覆盖率commons-beanutils-1.7.0.jar动态的获取/设值Java Bean的属性commons-chain-1.1.jar实现责任链设计模式的Java 类库commons-codec-1.3.jar⽤来处理常⽤的编码⽅法的⼯具类包,例如DES、SHA1、MD5、Base64等等commons-collections-3.1.jar对标准java Collection的扩展commons-collections.jar对标准java Collection的扩展commons-digester-1.8.jar⽤于处理struts-config.xml配置⽂件commons-fileupload-1.1.1.jar struts上传⽂件commons-httpclient-3.1.jar⽤来简化HTTP客户端与服务器端进⾏各种通信编程实现commons-io-1.1.jar针对java.io.InputStream和Reader进⾏了扩展commons-lang-2.4.jar对ng.*的扩展commons-logging-1.1.1.jar⽇志包commons-pool-1.3.jar实现对象池化框架commons-validator-1.3.1.jar⽤来把验证规则程序提取出来,以供重复使⽤db2jcc.jar java连接DB2所需jardb2jcc_license_cu.jar java连接DB2所需jardom4j-1.6.1.jar解析XMLehcache-1.2.4.jar hibernate的⼆级缓存如果⽤ehcache的时候需要此jar包emf.jar基于Eclipse的模型框架ezmorph-1.0.6.jar使⽤JSON所需的jar包FastInfoset-1.2.2.jar使⽤WebService所需的jar包freemarker-2.3.8.jar Strus2⽀持的⼀种表现层框架geronimo-activation_1.1_spec-1.0.2.jar Apache Geronimo所带jar包,geronimo-annotation_1.0_spec-1.1.1.jar Apache Geronimo所带jar包geronimo-javamail_1.4_spec-1.3.jar Apache Geronimo所带jar包geronimo-jaxws_2.1_spec-1.0.jar Apache Geronimo所带jar包geronimo-jaxws_2.1_spec-1.0.jar Apache Geronimo所带jar包geronimo-jms_1.1_spec-1.1.1.jar Apache Geronimo所带jar包geronimo-servlet_2.5_spec-1.2.jar Apache Geronimo所带jar包geronimo-stax-api_1.0_spec-1.0.1.jar Apache Geronimo所带jar包hibernate3.jar Hibernate3的核⼼jar包htmclientmodel.jar使⽤WebSphere所需jar包jakarta-oro.jar⼀套⽂本处理⼯具,提供per15.0兼容的表达式,AWK-like表达式,Glob表达式。
org.apache.http.client.HttpClient使⽤⽅法⼀.官⽹说明:Commons HttpClient项⽬现已结束,不再开发。
它已被其HttpClient和HttpCore模块中的Apache HttpComponents项⽬所取代,它们提供更好的性能和更⼤的灵活性。
从2011年开始,mons.httpclient就不再开发。
这就是说,它已经落伍了。
⽅法的对称性上的区别⼀、org.apache.http.clientorg.apache.http.client在发起请求前,假如对某个参数a 进⾏url encode编码。
服务端必须进⾏url decode。
//客户端编码Stirng a=URLEncoder.encode(cont,"GBK");//服务端解码URLDecoder.decode(a,"gbk");且服务器端获取到的参数a为可识别的没有任何变动的url encode后原值。
⼆、mons.httpclientmons.httpclient则与之相反。
服务端获取到的a为不可识别的乱码,且不能⽤url decode解码。
//服务端解码new String(cont.getBytes("ISO8859_1"), "GBK")与时俱进org.apache.http.client更好的性能和更⼤的灵活性。
三.pom.xml<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency><!-- https:///artifact/org.jsoup/jsoup --><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.11.3</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpmime</artifactId><version>4.5</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpcore</artifactId><version>4.4.1</version></dependency>最最简单的⽅法利⽤Jsoup直接获取HTML页⾯Document doc = Jsoup.connect("/xiaoshuodaquan/").get(); Elements elements = doc.getElementsContainingOwnText("⽃破苍穹");四.简单使⽤⽅法package com.feilong.reptile.util;import org.apache.http.client.HttpClient;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.impl.client.HttpClientBuilder;import org.apache.http.message.BasicNameValuePair;import org.apache.http.util.EntityUtils;import java.util.ArrayList;import java.util.List;import mons.codec.Charsets;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import ValuePair;public class MHttpClient {public void get(String url) throws Exception {// 创建HttpClient实例HttpClient client = HttpClientBuilder.create().build();// 根据URL创建HttpGet实例HttpGet get = new HttpGet(url);// 执⾏get请求,得到返回体HttpResponse response = client.execute(get);// 判断是否正常返回if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {// 解析数据String data = EntityUtils.toString(response.getEntity(),Charsets.UTF_8); System.out.println(data);}}public void post(String url) throws Exception {// 创建HttpClient实例HttpClient client = HttpClientBuilder.create().build();// 根据URL创建HttpPost实例HttpPost post = new HttpPost(url);// 构造post参数List<NameValuePair> params = new ArrayList<NameValuePair>();params.add(new BasicNameValuePair("name", "11"));// 编码格式转换UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params);// 传⼊请求体post.setEntity(entity);// 发送请求,得到响应体HttpResponse response = client.execute(post);// 判断是否正常返回if (response.getStatusLine().getStatusCode() == 200) {// 解析数据HttpEntity resEntity = response.getEntity();String data = EntityUtils.toString(resEntity);System.out.println(data);}}public static void main(String[] args) throws Exception {MHttpClient cl = new MHttpClient();String url = "/xiaoshuodaquan/";cl.get(url);}}六. 复杂使⽤⽅法package com.feilong.reptile.util;import java.io.IOException;import java.io.InterruptedIOException;import .UnknownHostException;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Map.Entry;import .ssl.SSLException;import mons.codec.Charsets;import org.apache.http.Header;import org.apache.http.HttpEntityEnclosingRequest;import org.apache.http.HttpRequest;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.HttpRequestRetryHandler;import org.apache.http.client.config.RequestConfig;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.client.protocol.HttpClientContext;import org.apache.http.client.utils.URIBuilder;import org.apache.http.config.SocketConfig;import org.apache.http.conn.ConnectTimeoutException;import org.apache.http.impl.client.HttpClients;import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;import org.apache.http.protocol.HttpContext;import org.apache.http.util.EntityUtils;/*** 使⽤HttpClient发送和接收Http请求** @author manzhizhen**/public class HttpUtils {private static HttpClient httpClient;// 最⼤连接数private static final int MAX_CONNECTION = 100;// 每个route能使⽤的最⼤连接数,⼀般和MAX_CONNECTION取值⼀样private static final int MAX_CONCURRENT_CONNECTIONS = 100;// 建⽴连接的超时时间,单位毫秒private static final int CONNECTION_TIME_OUT = 1000;// 请求超时时间,单位毫秒private static final int REQUEST_TIME_OUT = 1000;// 最⼤失败重试次数private static final int MAX_FAIL_RETRY_COUNT = 3;// 请求配置,可以复⽤private static RequestConfig requestConfig;static {SocketConfig socketConfig = SocketConfig.custom().setSoTimeout(REQUEST_TIME_OUT).setSoKeepAlive(true).setTcpNoDelay(true).build();requestConfig = RequestConfig.custom().setSocketTimeout(REQUEST_TIME_OUT).setConnectTimeout(CONNECTION_TIME_OUT).build();/*** 每个默认的 ClientConnectionPoolManager 实现将给每个route创建不超过2个并发连接,最多20个连接总数。
ApacheCommons各个jar包的功能说明BeanUtilsCommons-BeanUtils 提供对 Java 反射和⾃省API的包装BetwixtBetwixt提供将 JavaBean 映射⾄ XML ⽂档,以及相反映射的服务.ChainChain 提供实现组织复杂的处理流程的“责任链模式”.CLICLI 提供针对命令⾏参数,选项,选项组,强制选项等的简单API.CodecCodec 包含⼀些通⽤的编码解码算法。
包括⼀些语⾳编码器, Hex, Base64, 以及URL encoder.CollectionsCommons-Collections 提供⼀个类包来扩展和增加标准的 Java Collection框架ConfigurationCommons-Configuration ⼯具对各种各式的配置和参考⽂件提供读取帮助.Daemon⼀种 unix-daemon-like java 代码的替代机制DBCPCommons-DBCP 提供数据库连接池服务DbUtilsDbUtils 是⼀个 JDBC helper 类库,完成数据库任务的简单的资源清除代码.DigesterCommons-Digester 是⼀个 XML-Java对象的映射⼯具,⽤于解析 XML配置⽂件.DiscoveryCommons-Discovery 提供⼯具来定位资源 (包括类) ,通过使⽤各种模式来映射服务/引⽤名称和资源名称.ELCommons-EL 提供在JSP2.0规范中定义的EL表达式的解释器.FileUploadFileUpload 使得在你可以在应⽤和Servlet中容易的加⼊强⼤和⾼性能的⽂件上传能⼒HttpClientCommons-HttpClient 提供了可以⼯作于HTTP协议客户端的⼀个框架.IOIO 是⼀个 I/O ⼯具集JellyJelly是⼀个基于 XML 的脚本和处理引擎。
Jelly 借鉴了 JSP 定指标签,Velocity, Cocoon和Xdoclet中的脚本引擎的许多优点。
IDEA中的HTTPClient使⽤教程介绍IDEA RESTful WebServices是⼀个类似jmeter,postman的⼯具。
可以使⽤纯⽂本编辑。
该⼯具是idea的⼀个组件,在Tools->Http client下;当然goland也是相同;低版本是Test Restful WebService,新版本的idea已经提⽰改功能废弃,建议使⽤new HTTP Client也就是我们此教程要介绍的⼯具;⽰例:创建demo1.http⽂件###点击右侧运⾏即可查看到结果HTTP请求中使⽤变量要在请求中提供变量,请将其括在双花括号中,如 {{variable}} 。
变量名称只能包含字母,数字,下划线符号 _ 或连字符 - 。
预定义的动态变量每次您运⾏请求时,动态变量都会⽣成⼀个值: $uuid :⽣成通⽤的唯⼀标识符(UUID-v4) $timestamp :⽣成当前的UNIX 时间戳 $randomInt :⽣成介于0到1000之间的随机整数。
GET http://localhost/api/get?id={{$uuid}}创建环境变量在项⽬内部,创建以下⽂件:在rest-client.env.json(或http-client.env.json)是包含常见的变量,其⽬的是要与你的项⽬⼀起分发的常规⽂件。
在rest-client.private.env.json(或http-client.private.env.json)是⼀个私⼈的⽂件可能包括密码,令牌,证书和其他敏感信息。
默认情况下,此⽂件被添加到VCS忽略⽂件列表中。
在httpclient.private.env.json⽂件中指定的变量的值将覆盖环境⽂件中的值。
{"dev": {"host": "http://127.0.0.1:80","name": "zhangsan"},"prod": {"host": "http://127.0.0.1:80","name":"lisi"}}调⽤⽰例GET http://{{host}}/api/get?name={{name}}脚本设置环境变量//设置环境变量> {%client.global.set("token", response.body.token);%}脚本检测可以对返回值进⾏打印,断⾔;# 登陆POST http://{{host}}/system/loginContent-Type: application/x-www-form-urlencodedusername=admin&password=123456> {%client.log(JSON.stringify(response.body));client.test("Request executed successfully", function() {client.assert(response.status === 200, "Response status is not 200");});client.test("Response content-type is json", function() {var type = response.contentType.mimeType;client.assert(type === "application/json", "Expected 'application/json' but received '" + type + "'");});client.test("Request code success", function() {client.assert(response.body.code === 0, "Response code is not 0");client.global.set("token", response.body.data);});%}###类型介绍clientclient.globalset(varName, varValue) // 设置全局变量get(varName) // 获取全局变量isEmpty // 检查 global 是否为空clear(varName) // 删除变量clearAll // 删除所有变量client.test(testName, func) // 创建⼀个名称为 testName 的测试client.assert(condition, message) // 校验条件 condition 是否成⽴,否则抛出异常 message client.log(text) // 打印⽇志responseresponse.body // 字符串或 JSON (如果 content-type 为 application/json .)response.headersvalueOf(headerName) // 返回第⼀个匹配 headerName 的值,如果没有匹配的返回 null valuesOf(headerName) // 返回所有匹配 headerName 的值的数组,如果没有匹配的返回空数组response.status // Http 状态码,如: 200 / 400response.contentTypemimeType // 返回 MIME 类型,如: text/plain , text/xml , application/json .charset // 返回编码 UTF-8 等⽰例test.http#### GET请求GET http://{{host}}/api/get?name={{name}}#### POST请求POST http://{{host}}/api/post/kvContent-Type: application/x-www-form-urlencodedname=zhangsan&age=11#### POST请求POST http://{{host}}/api/post/jsonContent-Type: application/jsonreferer: https:///cookie: name=zhangsan; age=11{"name":"zhangsan","age":11}###test2.http#### 未登录POST http://{{host}}/system/user/info> {%client.log(JSON.stringify(response.body));client.test("Request executed successfully", function() {client.assert(response.status === 404, "Response status is not 200");});client.test("Response content-type is json", function() {var type = response.contentType.mimeType;client.assert(type === "application/json", "Expected 'application/json' but received '" + type + "'"); });client.test("Request code fail", function() {client.assert(response.body.code === -1, "Response code is not -1");});%}#### 登陆POST http://{{host}}/system/loginContent-Type: application/x-www-form-urlencodedusername=admin&password=123456> {%client.log(JSON.stringify(response.body));client.test("Request executed successfully", function() {client.assert(response.status === 200, "Response status is not 200");});client.test("Response content-type is json", function() {var type = response.contentType.mimeType;client.assert(type === "application/json", "Expected 'application/json' but received '" + type + "'"); });client.test("Request code success", function() {client.assert(response.body.code === 0, "Response code is not 0");client.global.set("token", response.body.data);});%}#### 登陆后访问⽤户信息POST http://{{host}}/system/user/infotoken: {{token}}> {%client.log(JSON.stringify(response.body));client.test("Request executed successfully", function() {client.assert(response.status === 200, "Response status is not 200");});client.test("Response content-type is json", function() {var type = response.contentType.mimeType;client.assert(type === "application/json", "Expected 'application/json' but received '" + type + "'"); });client.test("Request code success", function() {client.assert(response.body.code === 0, "Response code is not 0");});%}#### 登陆后访问⽤户年龄POST http://{{host}}/system/user/agetoken: {{token}}> {%client.log(JSON.stringify(response.body));client.test("Request executed successfully", function() {client.assert(response.status === 200, "Response status is not 200");});client.test("Response content-type is json", function() {var type = response.contentType.mimeType;client.assert(type === "application/json", "Expected 'application/json' but received '" + type + "'");client.test("Request code success", function() {client.assert(response.body.code === 0, "Response code is not 0"); });%}###http-client.env.json{"dev": {"host": "http://127.0.0.1:80","name": "zhangsan"},"prod": {"host": "http://127.0.0.1:80","name":"lisi"}}main.gopackage mainimport ("/gogf/gf/frame/g""/gogf/gf/net/ghttp""/gogf/gf/util/guuid")var token stringfunc main() {s := g.Server()group := s.Group("/api")// 默认路径// GET带参数group.GET("/get", func(r *ghttp.Request) {r.Response.Writeln("Hello World!")r.Response.Writeln("name:", r.GetString("name"))})// POST KVgroup.POST("/post/kv", func(r *ghttp.Request) {r.Response.Writeln("func:test")r.Response.Writeln("name:", r.GetString("name"))r.Response.Writeln("age:", r.GetInt("age"))})// POST JSONgroup.POST("/post/json", func(r *ghttp.Request) {r.Response.Writeln("func:test2")r.Response.Writeln("name:", r.GetString("name"))r.Response.Writeln("age:", r.GetString("age"))h := r.Headerr.Response.Writeln("referer:", h.Get("referer"))r.Response.Writeln("cookie:", h.Get("cookie"))r.Response.Writeln(r.Cookie.Map())})// 模拟登陆system := s.Group("/system")// 登陆接⼝system.POST("/login", func(r *ghttp.Request) {if "admin" == r.GetString("username") &&"123456" == r.GetString("password") {token = guuid.New().String()r.Response.WriteJson(g.Map{"code": 0,"data": token,})r.Exit()}r.Response.WriteJson(g.Map{"code": -1,"data": "",})// 获取⽤户信息system.POST("/user/info", func(r *ghttp.Request) {if token != r.Header.Get("token") || token == "" {r.Response.WriteJson(g.Map{"code": -1,"data": "",})r.Exit()}// 返回⽤户信息r.Response.WriteJson(g.Map{"code": 0,"data": "zhangsan",})})// 获取⽤户年龄system.POST("/user/age", func(r *ghttp.Request) {if token != r.Header.Get("token") || token == "" {r.Response.WriteJson(g.Map{"code": -1,"data": "",})r.Exit()}// 返回⽤户信息r.Response.WriteJson(g.Map{"code": 0,"data": 11,})})s.SetPort(80)s.Run()}代码地址教程视频到此这篇关于IDEA中的HTTP Client使⽤教程的⽂章就介绍到这了,更多相关IDEA HTTP Client使⽤内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
java开发常用的jar包的作用解释转载自:/chaod5659/article/details/8250845 java开发中主要用到的jar包描述commons-io.jar:可以看成是java.io的扩展,用来帮助进行IO功能开发.它包含三个主要的领域:Utilityclasses-提供一些静态方法来完成公共任务.Filters-提供文件过滤器的各种实现.Streams-提供实用的Stream,reader与writer实现.commons-beanutils.jar:提供对Java反射和自省API的包装,主要提供了对于JavaBean进行各种操作。
commons-digester.jar:它能方便地将XML文档所定义的元素转化为JAVA对象,其实它的用法有点象栈(当然内在的原理就是那个古老的东西,只是提供了更高一层的封装)。
commons-lang.jar:它扩展了标准ngAPI,增加了字符串操作方法、基本数值方法、对象反射、创建和串行化以及System属性。
它还包含一个可继承的enum类型、对多种嵌套的Exception 类型的支持、对java.util.Date的增强以及用于构建方法的实用程序,例如自动生成toString()的结果、自动实现hashCode()和equals()方法、数组操作、枚举、日期和时间的处理等等。
ArrayUtils–用于对数组的操作,如添加、查找、删除、子数组、倒序、元素类型转换等;BitField–用于操作位元,提供了一些方便而安全的方法;BooleanUtils–用于操作和转换boolean或者Boolean及相应的数组;CharEncoding–包含了Java环境支持的字符编码,提供是否支持某种编码的判断;CharRange–用于设定字符范围并做相应检查;CharSet–用于设定一组字符作为范围并做相应检查;CharSetUtils–用于操作CharSet;CharUtils–用于操作char值和Character对象;ClassUtils–用于对Java类的操作,不使用反射;ObjectUtils–用于操作Java对象,提供null安全的访问和其他一些功能;RandomStringUtils–用于生成随机的字符串;SerializationUtils–用于处理对象序列化,提供比一般Java序列化更高级的处理能力;StringEscapeUtils–用于正确处理转义字符,产生正确的Java、JavaScript、HTML、XML和SQL代码;StringUtils–处理String的核心类,提供了相当多的功能;SystemUtils–在ng.System基础上提供更方便的访问,如用户路径、Java版本、时区、操作系统等判断;Validate–提供验证的操作,有点类似assert断言;WordUtils–用于处理单词大小写、换行等。
JAR⽂件包及jar命令详解[导读] 常常在⽹上看到有⼈询问:如何把 java 程序编译成 .exe ⽂件。
通常回答只有两种,⼀种是制作⼀个可执⾏的 JAR ⽂件包,然后就可以像.chm ⽂档⼀样双击运⾏了;⽽另⼀种是使⽤ JET 来进⾏编译。
但是JET 是要⽤钱...常常在⽹上看到有⼈询问:如何把 java 程序编译成 .exe ⽂件。
通常回答只有两种,⼀种是制作⼀个可执⾏的 JAR ⽂件包,然后就可以像.chm ⽂档⼀样双击运⾏了;⽽另⼀种是使⽤ JET 来进⾏编译。
但是 JET 是要⽤钱买的,⽽且据说 JET 也不是能把所有的 Java 程序都编译成执⾏⽂件,性能也要打些折扣。
所以,使⽤制作可执⾏ JAR ⽂件包的⽅法就是最佳选择了,何况它还能保持 Java 的跨平台特性。
下⾯就来看看什么是 JAR ⽂件包吧:1. JAR ⽂件包JAR ⽂件就是 Java Archive File,顾名思意,它的应⽤是与 Java 息息相关的,是 Java 的⼀种⽂档格式。
JAR ⽂件⾮常类似 ZIP ⽂件——准确的说,它就是 ZIP ⽂件,所以叫它⽂件包。
JAR ⽂件与 ZIP ⽂件唯⼀的区别就是在 JAR ⽂件的内容中,包含了⼀个 META-INF/MANIFEST.MF ⽂件,这个⽂件是在⽣成 JAR ⽂件的时候⾃动创建的。
举个例⼦,如果我们具有如下⽬录结构的⼀些⽂件:==`-- test`-- Test.class把它压缩成 ZIP ⽂件 test.zip,则这个 ZIP ⽂件的内部⽬录结构为:test.zip`-- test`-- Test.class如果我们使⽤ JDK 的 jar 命令把它打成 JAR ⽂件包 test.jar,则这个 JAR ⽂件的内部⽬录结构为:test.jar|-- META-INF| `-- MANIFEST.MF`-- test`--Test.class2. 创建可执⾏的 JAR ⽂件包制作⼀个可执⾏的 JAR ⽂件包来发布你的程序是 JAR ⽂件包最典型的⽤法。
httpclient4 中文版帮助文档,最新官方版翻译版前言超文本传输协议(HTTP)也许是当今互联网上使用的最重要的协议了。
Web服务,有网络功能的设备和网络计算的发展,都持续扩展了HTTP协议的角色,超越了用户使用的Web 浏览器范畴,同时,也增加了需要HTTP协议支持的应用程序的数量。
尽管包提供了基本通过HTTP访问资源的功能,但它没有提供全面的灵活性和其它很多应用程序需要的功能。
HttpClient就是寻求弥补这项空白的组件,通过提供一个有效的,保持更新的,功能丰富的软件包来实现客户端最新的HTTP标准和建议。
为扩展而设计,同时为基本的HTTP协议提供强大的支持,HttpClient组件也许就是构建HTTP客户端应用程序,比如web浏览器,web服务端,利用或扩展HTTP协议进行分布式通信的系统的开发人员的关注点。
1. HttpClient的范围基于HttpCore[/httpcomponents-core/index.html]的客户端HTTP运输实现库基于经典(阻塞)I/O内容无关2. 什么是HttpClient不能做的HttpClient 不是一个浏览器。
它是一个客户端的HTTP通信实现库。
HttpClient的目标是发送和接收HTTP报文。
HttpClient不会去缓存内容,执行嵌入在HTML页面中的javascript 代码,猜测内容类型,重新格式化请求/重定向URI,或者其它和HTTP运输无关的功能。
第一章基础1.1 执行请求HttpClient 最重要的功能是执行HTTP方法。
一个HTTP方法的执行包含一个或多个HTTP请求/HTTP响应交换,通常由HttpClient的内部来处理。
而期望用户提供一个要执行的请求对象,而HttpClient期望传输请求到目标服务器并返回对应的响应对象,或者当执行不成功时抛出异常。
很自然地,HttpClient API的主要切入点就是定义描述上述规约的HttpClient接口。
一、HttpClient 功能简介●实现了所有HTTP 的方法(GET,POST,PUT,HEAD,OPTIONS,TRACE)●支持自动转向●支持HTTPS 协议●透明地穿过HTTP代理建立连接●通过CONNECT方法,利用通过建立穿过HTTP代理的HTTPS连接●利用本地Java socket,透明地穿过SOCKS(版本5和4)代理建立连接●支持利用Basic、Digest和NTLM加密的认证●支持用于上传大文件的Multi-Part表单POST方法●插件式安全socket实现,易于使用第三方的解决方案●连接管理,支持多线程应用,支持设定单个主机总连接和最高连接数量,自动检测和关闭失效的连接●直接将请求信息流送到服务器的端口●直接读取从服务器的端口送出的应答信息●支持HTTP/1.0中用KeepAlive和HTTP/1.1中用persistance设置的持久连接●直接访问由服务器送出的应答代码和头部信息●可设置连接超时时间●HttpMethods 实现Command Pattern,以允许并行请求或高效连接复用●遵循the Apache Software License协议,源码免费可得二、环境搭建1.HttpClient 3.1 所需的基本jar包:commons-httpclient-3.1.jar,下载地址:/dist/httpcomponents/commons-httpclient/binary/;commons-logging.jar,下载地址:/logging/download_logging.cgi;commons-codec.jar,下载地址:/codec/download_codec.cgi;2.HttpClient 4所需的基本jar包:下载地址:/downloads.cgi;最新版本为4.1.2,且官方不再升级HttpClient3。
三、HttpClient 3.x 基本功能的使用1.使用 HttpClient 需要以下 6 个步骤:●创建HttpClient 的实例●创建某种连接方法的实例,在这里是GetMethod。
HttpClient及有关jar包详解1.HttpClient简介HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持HTTP 协议的客户端编程工具包,并且它支持HTTP 协议最新的版本和建议。
本文首先介绍HTTPClient,然后根据作者实际工作经验给出了一些常见问题的解决方法。
HTTP 协议可能是现在Internet 上使用得最多、最重要的协议了,越来越多的Java 应用程序需要直接通过HTTP 协议来访问网络资源。
虽然在JDK 的 包中已经提供了访问HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。
HttpClient 是Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP 协议的客户端编程工具包,并且它支持HTTP 协议最新的版本和建议。
HttpClient 已经应用在很多的项目中,比如Apache Jakarta 上很著名的另外两个开源项目Cactus 和HTMLUnit 都使用了HttpClient。
现在HttpClient最新版本为HttpClient4.0-beta22.HttpClient 功能介绍以下列出的是HttpClient 提供的主要的功能,要知道更多详细的功能可以参见HttpClient 的主页。
(1)实现了所有HTTP 的方法(GET,POST,PUT,HEAD 等)(2)支持自动转向(3)支持HTTPS 协议(4)支持代理服务器等3.HttpClient 基本功能的使用(1) GET方法使用HttpClient 需要以下6 个步骤:1. 创建HttpClient 的实例2. 创建某种连接方法的实例,在这里是GetMethod。
在GetMethod 的构造函数中传入待连接的地址3. 调用第一步中创建好的实例的execute 方法来执行第二步中创建好的method 实例4. 读response5. 释放连接。
无论执行方法是否成功,都必须释放连接6. 对得到后的内容进行处理根据以上步骤,我们来编写用GET方法来取得某网页内容的代码。
大部分情况下HttpClient 默认的构造函数已经足够使用。
HttpClient httpClient = new HttpClient();创建GET方法的实例。
在GET方法的构造函数中传入待连接的地址即可。
用GetMethod 将会自动处理转发过程,如果想要把自动处理转发过程去掉的话,可以调用方法setFollowRedirects(false)。
GetMethod getMethod = new GetMethod(".....");调用实例httpClient的executeMethod方法来执行getMethod。
由于是执行在网络上的程序,在运行executeMethod方法的时候,需要处理两个异常,分别是HttpException和IOException。
引起第一种异常的原因主要可能是在构造getMethod的时候传入的协议不对,比如不小心将"http"写成"htp",或者服务器端返回的内容不正常等,并且该异常发生是不可恢复的;第二种异常一般是由于网络原因引起的异常,对于这种异常(IOException),HttpClient 会根据你指定的恢复策略自动试着重新执行executeMethod方法。
HttpClient的恢复策略可以自定义(通过实现接口HttpMethodRetryHandler来实现)。
通过httpClient的方法setParameter设置你实现的恢复策略,本文中使用的是系统提供的默认恢复策略,该策略在碰到第二类异常的时候将自动重试3次。
executeMethod返回值是一个整数,表示了执行该方法后服务器返回的状态码,该状态码能表示出该方法执行是否成功、需要认证或者页面发生了跳转(默认状态下GetMethod的实例是自动处理跳转的)等。
//设置成了默认的恢复策略,在发生异常时候将自动重试3次,在这里你也可以设置成自定义的恢复策略getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());//执行getMethodint statusCode = client.executeMethod(getMethod);if (statusCode != HttpStatus.SC_OK) {System.err.println("Method failed: " + getMethod.getStatusLine());}在返回的状态码正确后,即可取得内容。
取得目标地址的内容有三种方法:第一种,getResponseBody,该方法返回的是目标的二进制的byte流;第二种,getResponseBodyAsString,这个方法返回的是String类型,值得注意的是该方法返回的String的编码是根据系统默认的编码方式,所以返回的String值可能编码类型有误,在本文的"字符编码"部分中将对此做详细介绍;第三种,getResponseBodyAsStream,这个方法对于目标地址中有大量数据需要传输是最佳的。
在这里我们使用了最简单的getResponseBody方法。
byte[] responseBody = method.getResponseBody();释放连接。
无论执行方法是否成功,都必须释放连接。
method.releaseConnection();处理内容。
在这一步中根据你的需要处理内容,在例子中只是简单的将内容打印到控制台。
System.out.println(new String(responseBody));下面是程序的完整代码,这些代码也可在附件中的test.GetSample中找到。
package test;import java.io.IOException;import mons.httpclient.*;import mons.httpclient.methods.GetMethod;import mons.httpclient.params.HttpMethodParams;public class GetSample{public static void main(String[] args) {//构造HttpClient的实例HttpClient httpClient = new HttpClient();//创建GET方法的实例GetMethod getMethod = new GetMethod("...");//使用系统提供的默认的恢复策略getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());try {//执行getMethodint statusCode = httpClient.executeMethod(getMethod);if (statusCode != HttpStatus.SC_OK) {System.err.println("Method failed: "+ getMethod.getStatusLine());}//读取内容byte[] responseBody = getMethod.getResponseBody();//处理内容System.out.println(new String(responseBody));} catch (HttpException e) {//发生致命的异常,可能是协议不对或者返回的内容有问题System.out.println("Please check your provided http address!");e.printStackTrace();} catch (IOException e) {//发生网络异常e.printStackTrace();} finally {//释放连接getMethod.releaseConnection();}}}(2)POST方法根据RFC2616,对POST的解释如下:POST方法用来向目的服务器发出请求,要求它接受被附在请求后的实体,并把它当作请求队列(Request-Line)中请求URI所指定资源的附加新子项。
POST被设计成用统一的方法实现下列功能:对现有资源的注释(Annotation of existing resources)向电子公告栏、新闻组,邮件列表或类似讨论组发送消息提交数据块,如将表单的结果提交给数据处理过程通过附加操作来扩展数据库调用HttpClient中的PostMethod与GetMethod类似,除了设置PostMethod的实例与GetMethod有些不同之外,剩下的步骤都差不多。
在下面的例子中,省去了与GetMethod 相同的步骤,只说明与上面不同的地方,并以登录清华大学BBS为例子进行说明。
构造PostMethod之前的步骤都相同,与GetMethod一样,构造PostMethod也需要一个URI参数。
在创建了PostMethod的实例之后,需要给method实例填充表单的值,在BBS 的登录表单中需要有两个域,第一个是用户名(域名叫id),第二个是密码(域名叫passwd)。
表单中的域用类NameValuePair来表示,该类的构造函数第一个参数是域名,第二参数是该域的值;将表单所有的值设置到PostMethod中用方法setRequestBody。
另外由于BBS登录成功后会转向另外一个页面,但是HttpClient对于要求接受后继服务的请求,比如POST和PUT,不支持自动转发,因此需要自己对页面转向做处理。
具体的页面转向处理请参见下面的"自动转向"部分。
代码如下:String url = "....";PostMethod postMethod = new PostMethod(url);// 填入各个表单域的值NameValuePair[] data = { new NameValuePair("id", "youUserName"),new NameValuePair("passwd", "yourPwd") };// 将表单的值放入postMethod中postMethod.setRequestBody(data);// 执行postMethodint statusCode = httpClient.executeMethod(postMethod);// HttpClient对于要求接受后继服务的请求,象POST和PUT等不能自动处理转发// 301或者302if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY ||statusCode == HttpStatus.SC_MOVED_TEMPORARILY) {// 从头中取出转向的地址Header locationHeader = postMethod.getResponseHeader("location");String location = null;if (locationHeader != null) {location = locationHeader.getValue();System.out.println("The page was redirected to:" + location);} else {System.err.println("Location field value is null.");}return;}4 使用HttpClient过程中常见的一些问题下面介绍在使用HttpClient过程中常见的一些问题。