Java调用Http/Https接口(3)--Commons-HttpClient调用Http/Https接口
Commons-HttpClient原来是Apache Commons项目下的一个组件,现已被HttpComponents项目下的HttpClient组件所取代;作为调用Http接口的一种选择,本文介绍下其使用方法。文中所使用到的软件版本:Java 1.8.0_191、Commons-HttpClient 3.1。
1、服务端
2、调用Http接口
2.1、GET请求
- public static void get() {
- try {
- String requestPath = "http://localhost:8080/demo/httptest/getUser?userId=1000&userName=" + URLEncoder.encode("李白", "utf-8");
- HttpClient httpClient = new HttpClient();
- GetMethod get = new GetMethod(requestPath);
- int status = httpClient.executeMethod(get);
- if (status == HttpStatus.SC_OK) {
- System.out.println("GET返回结果:" + new String(get.getResponseBody()));
- } else {
- System.out.println("GET返回状态码:" + status);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
2.2、POST请求(发送键值对数据)
- public static void post() {
- try {
- String requestPath = "http://localhost:8080/demo/httptest/getUser";
- HttpClient httpClient = new HttpClient();
- PostMethod post = new PostMethod(requestPath);
- post.addRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
- String param = "userId=1000&userName=李白";
- post.setRequestEntity(new ByteArrayRequestEntity(param.getBytes()));
- int status = httpClient.executeMethod(post);
- if (status == HttpStatus.SC_OK) {
- System.out.println("POST返回结果:" + new String(post.getResponseBody()));
- } else {
- System.out.println("POST返回状态码:" + status);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
2.3、POST请求(发送JSON数据)
- public static void post2() {
- try {
- String requestPath = "http://localhost:8080/demo/httptest/addUser";
- HttpClient httpClient = new HttpClient();
- PostMethod post = new PostMethod(requestPath);
- post.addRequestHeader("Content-type", "application/json");
- String param = "{\"userId\": \"1001\",\"userName\":\"杜甫\"}";
- post.setRequestEntity(new ByteArrayRequestEntity(param.getBytes()));
- int status = httpClient.executeMethod(post);
- if (status == HttpStatus.SC_OK) {
- System.out.println("POST json返回结果:" + new String(post.getResponseBody()));
- } else {
- System.out.println("POST json返回状态码:" + status);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
2.4、上传文件
- public static void upload() {
- try {
- String requestPath = "http://localhost:8080/demo/httptest/upload";
- HttpClient httpClient = new HttpClient();
- PostMethod post = new PostMethod(requestPath);
- FileInputStream fileInputStream = new FileInputStream("d:/a.jpg");
- post.setRequestEntity(new InputStreamRequestEntity(fileInputStream));
- int status = httpClient.executeMethod(post);
- if (status == HttpStatus.SC_OK) {
- System.out.println("upload返回结果:" + new String(post.getResponseBody()));
- } else {
- System.out.println("upload返回状态码:" + status);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
2.5、上传文件及发送键值对数据
- public static void multi() {
- try {
- String requestPath = "http://localhost:8080/demo/httptest/multi";
- HttpClient httpClient = new HttpClient();
- PostMethod post = new PostMethod(requestPath);
- File file = new File("d:/a.jpg");
- Part[] parts = {new FilePart("file", file), new StringPart("param1", "参数1", "utf-8"), new StringPart("param2", "参数2", "utf-8")};
- post.setRequestEntity(new MultipartRequestEntity(parts, post.getParams()));
- int status = httpClient.executeMethod(post);
- if (status == HttpStatus.SC_OK) {
- System.out.println("multi返回结果:" + new String(post.getResponseBody()));
- } else {
- System.out.println("multi返回状态码:" + status);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
2.6、完整例子
- package com.inspur.demo.http.client;
- import java.io.File;
- import java.io.FileInputStream;
- import java.net.URLEncoder;
- import org.apache.commons.httpclient.HttpClient;
- import org.apache.commons.httpclient.HttpStatus;
- import org.apache.commons.httpclient.methods.ByteArrayRequestEntity;
- import org.apache.commons.httpclient.methods.GetMethod;
- import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
- import org.apache.commons.httpclient.methods.PostMethod;
- import org.apache.commons.httpclient.methods.multipart.FilePart;
- import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
- import org.apache.commons.httpclient.methods.multipart.Part;
- import org.apache.commons.httpclient.methods.multipart.StringPart;
- /**
- *
- * 通过Commons-HttpClient调用Http接口
- *
- */
- public class CommonsHttpClientCase {
- /**
- * GET请求
- */
- public static void get() {
- try {
- String requestPath = "http://localhost:8080/demo/httptest/getUser?userId=1000&userName=" + URLEncoder.encode("李白", "utf-8");
- HttpClient httpClient = new HttpClient();
- GetMethod get = new GetMethod(requestPath);
- int status = httpClient.executeMethod(get);
- if (status == HttpStatus.SC_OK) {
- System.out.println("GET返回结果:" + new String(get.getResponseBody()));
- } else {
- System.out.println("GET返回状态码:" + status);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * POST请求(发送键值对数据)
- */
- public static void post() {
- try {
- String requestPath = "http://localhost:8080/demo/httptest/getUser";
- HttpClient httpClient = new HttpClient();
- PostMethod post = new PostMethod(requestPath);
- post.addRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
- String param = "userId=1000&userName=李白";
- post.setRequestEntity(new ByteArrayRequestEntity(param.getBytes()));
- int status = httpClient.executeMethod(post);
- if (status == HttpStatus.SC_OK) {
- System.out.println("POST返回结果:" + new String(post.getResponseBody()));
- } else {
- System.out.println("POST返回状态码:" + status);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * POST请求(发送json数据)
- */
- public static void post2() {
- try {
- String requestPath = "http://localhost:8080/demo/httptest/addUser";
- HttpClient httpClient = new HttpClient();
- PostMethod post = new PostMethod(requestPath);
- post.addRequestHeader("Content-type", "application/json");
- String param = "{\"userId\": \"1001\",\"userName\":\"杜甫\"}";
- post.setRequestEntity(new ByteArrayRequestEntity(param.getBytes()));
- int status = httpClient.executeMethod(post);
- if (status == HttpStatus.SC_OK) {
- System.out.println("POST json返回结果:" + new String(post.getResponseBody()));
- } else {
- System.out.println("POST json返回状态码:" + status);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 上传文件
- */
- public static void upload() {
- try {
- String requestPath = "http://localhost:8080/demo/httptest/upload";
- HttpClient httpClient = new HttpClient();
- PostMethod post = new PostMethod(requestPath);
- FileInputStream fileInputStream = new FileInputStream("d:/a.jpg");
- post.setRequestEntity(new InputStreamRequestEntity(fileInputStream));
- int status = httpClient.executeMethod(post);
- if (status == HttpStatus.SC_OK) {
- System.out.println("upload返回结果:" + new String(post.getResponseBody()));
- } else {
- System.out.println("upload返回状态码:" + status);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 上传文件及发送键值对数据
- */
- public static void multi() {
- try {
- String requestPath = "http://localhost:8080/demo/httptest/multi";
- HttpClient httpClient = new HttpClient();
- PostMethod post = new PostMethod(requestPath);
- File file = new File("d:/a.jpg");
- Part[] parts = {new FilePart("file", file), new StringPart("param1", "参数1", "utf-8"), new StringPart("param2", "参数2", "utf-8")};
- post.setRequestEntity(new MultipartRequestEntity(parts, post.getParams()));
- int status = httpClient.executeMethod(post);
- if (status == HttpStatus.SC_OK) {
- System.out.println("multi返回结果:" + new String(post.getResponseBody()));
- } else {
- System.out.println("multi返回状态码:" + status);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- get();
- post();
- post2();
- upload();
- multi();
- }
- }
3、调用Https接口
与调用Http接口不一样的部分主要在设置ssl部分,设置方法是自己实现ProtocolSocketFactory接口;其ssl的设置与HttpsURLConnection很相似(参见Java调用Http/Https接口(2)--HttpURLConnection/HttpsURLConnection调用Http/Https接口);下面用GET请求来演示ssl的设置,其他调用方式类似。
- package com.inspur.demo.http.client;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.net.InetAddress;
- import java.net.InetSocketAddress;
- import java.net.Socket;
- import java.net.SocketAddress;
- import java.net.UnknownHostException;
- import java.security.KeyStore;
- import java.security.cert.CertificateException;
- import java.security.cert.X509Certificate;
- import javax.net.ssl.KeyManager;
- import javax.net.ssl.KeyManagerFactory;
- import javax.net.ssl.SSLContext;
- import javax.net.ssl.SSLSocketFactory;
- import javax.net.ssl.TrustManager;
- import javax.net.ssl.TrustManagerFactory;
- import javax.net.ssl.X509TrustManager;
- import org.apache.commons.httpclient.ConnectTimeoutException;
- import org.apache.commons.httpclient.HttpClient;
- import org.apache.commons.httpclient.methods.GetMethod;
- import org.apache.commons.httpclient.params.HttpConnectionParams;
- import org.apache.commons.httpclient.protocol.Protocol;
- import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
- import com.inspur.demo.common.util.FileUtil;
- /**
- *
- * 通过Commons-HttpClient调用Https接口
- *
- */
- public class CommonsHttpClientHttpsCase {
- public static void main(String[] args) {
- try {
- HttpClient httpClient = new HttpClient();
- /*
- * 请求有权威证书的地址
- */
- String requestPath = "https://www.baidu.com/";
- GetMethod get = new GetMethod(requestPath);
- httpClient.executeMethod(get);
- System.out.println("GET1返回结果:" + new String(get.getResponseBody()));
- /*
- * 请求自定义证书的地址
- */
- //获取信任证书库
- KeyStore trustStore = getkeyStore("jks", "d:/temp/cacerts", "123456");
- //不需要客户端证书
- requestPath = "https://10.40.103.48:9010/zsywservice";
- Protocol.registerProtocol("https", new Protocol("https", new HttpsProtocolSocketFactory(trustStore), 443));
- get = new GetMethod(requestPath);
- httpClient.executeMethod(get);
- System.out.println("GET2返回结果:" + new String(get.getResponseBody()));
- //需要客户端证书
- requestPath = "https://10.40.103.48:9016/zsywservice";
- KeyStore keyStore = getkeyStore("pkcs12", "d:/client.p12", "123456");
- Protocol.registerProtocol("https", new Protocol("https", new HttpsProtocolSocketFactory(keyStore, "123456", trustStore), 443));
- get = new GetMethod(requestPath);
- httpClient.executeMethod(get);
- System.out.println("GET3返回结果:" + new String(get.getResponseBody()));
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 获取证书
- * @return
- */
- private static KeyStore getkeyStore(String type, String filePath, String password) {
- KeyStore keySotre = null;
- FileInputStream in = null;
- try {
- keySotre = KeyStore.getInstance(type);
- in = new FileInputStream(new File(filePath));
- keySotre.load(in, password.toCharArray());
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- FileUtil.close(in);
- }
- return keySotre;
- }
- }
- final class HttpsProtocolSocketFactory implements ProtocolSocketFactory {
- private KeyStore keyStore;
- private String keyStorePassword;
- private KeyStore trustStore;
- private SSLSocketFactory sslSocketFactory = null;
- public HttpsProtocolSocketFactory(KeyStore keyStore, String keyStorePassword, KeyStore trustStore) {
- this.keyStore = keyStore;
- this.keyStorePassword = keyStorePassword;
- this.trustStore = trustStore;
- }
- public HttpsProtocolSocketFactory(KeyStore trustStore) {
- this.trustStore = trustStore;
- }
- private SSLSocketFactory getSSLSocketFactory() {
- if (sslSocketFactory != null) {
- return sslSocketFactory;
- }
- try {
- KeyManager[] keyManagers = null;
- TrustManager[] trustManagers = null;
- if (keyStore != null) {
- KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
- keyManagerFactory.init(keyStore, keyStorePassword.toCharArray());
- keyManagers = keyManagerFactory.getKeyManagers();
- }
- if (trustStore != null) {
- TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509");
- trustManagerFactory.init(trustStore);
- trustManagers = trustManagerFactory.getTrustManagers();
- } else {
- trustManagers = new TrustManager[] { new DefaultTrustManager() };
- }
- SSLContext context = SSLContext.getInstance("TLSv1.2");
- context.init(keyManagers, trustManagers, null);
- sslSocketFactory = context.getSocketFactory();
- return sslSocketFactory;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- @Override
- public Socket createSocket(String host, int port, InetAddress localAddress, int localPort)
- throws IOException, UnknownHostException {
- return getSSLSocketFactory().createSocket(host, port, localAddress, localPort);
- }
- @Override
- public Socket createSocket(String host, int port, InetAddress localAddress, int localPort,
- HttpConnectionParams params) throws IOException, UnknownHostException, ConnectTimeoutException {
- if (params == null) {
- throw new IllegalArgumentException("Parameters may not be null");
- }
- int timeout = params.getConnectionTimeout();
- if (timeout == 0) {
- return getSSLSocketFactory().createSocket(host, port, localAddress, localPort);
- } else {
- Socket socket = getSSLSocketFactory().createSocket();
- SocketAddress localAddr = new InetSocketAddress(localAddress, localPort);
- SocketAddress remoteAddr = new InetSocketAddress(host, port);
- socket.bind(localAddr);
- socket.connect(remoteAddr, timeout);
- return socket;
- }
- }
- @Override
- public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
- return getSSLSocketFactory().createSocket(host, port);
- }
- }
- final class DefaultTrustManager implements X509TrustManager {
- @Override
- public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
- }
- @Override
- public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
- }
- @Override
- public X509Certificate[] getAcceptedIssuers() {
- return null;
- }
- }
Java调用Http/Https接口(3)--Commons-HttpClient调用Http/Https接口的更多相关文章
- SpringMVC 结合HttpClient调用第三方接口实现
使用HttpClient 依赖jar包 1:commons-httpclient-3.0.jar 2:commons-logging-1.1.1.jar 3:commons-codec-1.6.jar ...
- httpclient调用https
httpclient调用https报错: Exception in thread "main" java.lang.Exception: sun.security.validato ...
- java apache commons HttpClient发送get和post请求的学习整理(转)
文章转自:http://blog.csdn.net/ambitiontan/archive/2006/01/06/572171.aspx HttpClient 是我最近想研究的东西,以前想过的一些应用 ...
- Java发布webservice应用并发送SOAP请求调用
webservice框架有很多,比如axis.axis2.cxf.xFire等等,做服务端和做客户端都可行,个人感觉使用这些框架的好处是减少了对于接口信息的解析,最主要的是减少了对于传递于网络中XML ...
- httpclient跳过https请求的验证
一.因为在使用https发送请求的时候会涉及,验证方式.但是这种方式在使用的时候很不方便.特别是在请求外部接口的时候,所以这我写了一个跳过验证的方式.(供参考) 二.加入包,这里用的是commons- ...
- org.apache.commons.httpclient.HttpClient的使用(转)
HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源.虽然在 JDK 的 java net包中已经提供了访 ...
- Java网络编程:利用apache的HttpClient包进行http操作
本文介绍如何利用apache的HttpClient包进行http操作,包括get操作和post操作. 一.下面的代码是对HttpClient包的封装,以便于更好的编写应用代码. import java ...
- Java调用Http/Https接口(4)--HttpClient调用Http/Https接口
HttpClient是Apache HttpComponents项目下的一个组件,是Commons-HttpClient的升级版,两者api调用写法也很类似.文中所使用到的软件版本:Java 1.8. ...
- java 通过httpclient调用https 的webapi
java如何通过httpclient 调用采用https方式的webapi?如何验证证书.示例:https://devdata.osisoft.com/p...需要通过httpclient调用该接口, ...
- Java之HttpClient调用WebService接口发送短信源码实战
摘要 Java之HttpClient调用WebService接口发送短信源码实战 一:接口文档 二:WSDL 三:HttpClient方法 HttpClient方法一 HttpClient方法二 Ht ...
随机推荐
- java并发编程(二)synchronized
参考文章: http://blog.csdn.net/javazejian/article/details/72828483http://ifeve.com/java-synchronized/htt ...
- [Gamma阶段]第五次Scrum Meeting
Scrum Meeting博客目录 [Gamma阶段]第五次Scrum Meeting 基本信息 名称 时间 地点 时长 第五次Scrum Meeting 19/05/31 大运村寝室6楼 30min ...
- MySQL事务隔离级别(二)
搞清楚MySQL事务隔离级别 首先创建一个表 account.创建表的过程略过(由于 InnoDB 存储引擎支持事务,所以将表的存储引擎设置为 InnoDB).表的结构如下: 为了说明问题,我们打开两 ...
- SpringBoot——Profile多环境支持
1.多profile文件形式 主配置文件编写时, 文件名可以是application-{profile}.properties/yml 默认使用的application.properties的配置. ...
- Microsoft.Owin 使用 文件服务
添加引用: <package id="Microsoft.Owin" version="4.0.1" targetFramework="net4 ...
- vue npm run dev 报错 semver\semver.js:312 throw new TypeError('Invalid Version: ' + version)
npm run dev运行报错信息如下图: 原因分析: 版本问题 解决办法: 在semver.js(node_modules/semver/semver.js)里做了一些改动,代码如下: // if ...
- android ------ 高版本的 Tablayout 下划线宽度
前面呢,有写过TabLayout的博客,最近开发用到了高本版遇到一些问题,来总结一下 Android--------TabLayout实现新闻客户端顶部导航栏 Android中Tablayout设置下 ...
- 【Node.js】Node.js的安装
Node.js的简介 简单的说,Node.js 是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. Node.js是一个事件 ...
- Openresty与Tengine
Tengine官方网站:http://tengine.taobao.org/index_cn.html OpenResty官方网站:http://openresty.org/ Openresty和Te ...
- 946. Validate Stack Sequences
946. Validate Stack Sequences class Solution { public: bool validateStackSequences(vector<int> ...