最近为客户做了一个程序使用httpclient调用Quickr for Domino的REST API获取Quickr中的文档列表,本来是一个简单的事情,可是这个客户的环境有一些麻烦。第一,他们启用了SSL,但是证书过期了。(状况就是每次访问Quickr时,浏览器都要报证书过期的警告)。第二,Quickr页面被做了定制,无法找到REST API的URL。经过两天的研究,终于解决。特以博客方式记录下来。
如何找到特定页面的REST API URL呢?经过艰难的研究,发现其实很简单,REST API URL就是页面URL后加一个“&Form=hAtom”后缀即可,例如页面的URL是 https://quickr.abc.cn/LotusQuickr/place/PageLibrary482576D300250AF3.nsf /h_Toc/EDC922351AF87015482576D300278C21/?OpenDocument,那么它REST URL就是 https://quickr.abc.cn/LotusQuickr/place/PageLibrary482576D300250AF3.nsf /h_Toc/EDC922351AF87015482576D300278C21/?OpenDocument&Form=hAtom,很简单吧。
第二个问题,如何解决启用SSL证书过期,通过httpclient访问的问题呢,这个比较麻烦了,直接上代码吧
Protocol easyhttps = new Protocol("https", new EasySSLProtocolSocketFactory(), 443);
Protocol.registerProtocol("https", easyhttps);
HttpClient httpClient = new HttpClient();
httpClient.getParams().setContentCharset("UTF-8");
HostConfiguration hc = new HostConfiguration();
hc.setHost("quickr.abc.cn", 80, easyhttps);
PostMethod httpMethod = new PostMethod("https://quickr.abc.cn/LotusQuickr/place/PageLibrary482576D300250AF3.nsf?Login");
httpClient.executeMethod(hc,httpMethod);
httpMethod.releaseConnection();
这里面涉及到一个自定义类EasySSLProtocolSocketFactory,直接参考我附件中两个java文件的实现吧,实话说我也没看懂。不过好用,:-)
在开发过程中还遇到一个问题,就是httpclient不支持url自动的跳转,因此本需要一次访问的就需要做两次调用。完整的代码如下:
package com.abc.quickr;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.abdera.Abdera;
import org.apache.abdera.model.Document;
import org.apache.abdera.model.Entry;
import org.apache.abdera.model.Feed;
import org.apache.abdera.parser.Parser;
import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.protocol.Protocol;
public class PlacesHelper {
public List<Entry> getPlaces()
{
try {
Protocol easyhttps = new Protocol("https", new EasySSLProtocolSocketFactory(), 443);
Protocol.registerProtocol("https", easyhttps);
HttpClient httpClient = new HttpClient();
httpClient.getParams().setContentCharset("UTF-8");
HostConfiguration hc = new HostConfiguration();
hc.setHost("qucikr.abc.cn", 80, easyhttps);
PostMethod httpMethod = new PostMethod("https://qucikr.abc.cn/LotusQuickr/place/PageLibrary482576D300250AF3.nsf?Login");
NameValuePair username = new NameValuePair("username", "admin");
NameValuePair password = new NameValuePair("password", "password");
httpMethod.setRequestBody(new NameValuePair[]{username,password});
httpClient.executeMethod(hc,httpMethod);
httpMethod.releaseConnection();
GetMethod redirect = new GetMethod("https://qucikr.abc.cn/LotusQuickr/place/PageLibrary482576D300250AF3.nsf/h_Toc/EDC922351AF87015482576D300278C21/?OpenDocument&Form=hAtom");
httpClient.executeMethod(hc,redirect);
InputStream in = redirect.getResponseBodyAsStream();
Parser parser = Abdera.getNewParser();
Document<Feed> doc = parser.parse(in);
Feed feed = (Feed) doc.getRoot();
return feed.getEntries();
} catch (HttpException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
分享到:
相关推荐
在IT行业中,网络通信是至关重要的,特别是在进行Web服务交互时...通过学习上述内容,你将能够使用HTTPClient 4.5成功访问那些需要绕过SSL认证的HTTPS网站。在实际项目中,一定要谨慎处理这种情况,确保数据的安全性。
### WebApi系列-通过HttpClient来调用WebApi接口 #### 一、概述 在现代Web开发中,Web API已经成为一种非常流行的模式,用于提供服务端与客户端之间的数据交互。随着.NET Framework以及.NET Core的发展,微软提供...
这个实例主要涉及如何配置HttpClient来忽略SSL(Secure Socket Layer)验证,这对于在开发和测试环境中处理自签名证书或未认证的服务器非常有用。以下将详细介绍HttpClient的使用以及如何进行SSL验证的忽略。 首先...
使用HttpClient4.5实现https请求忽略SSL证书验证工具类
在IT行业中,网络通信是应用程序之间交互的重要方式。...在apitest文件中,你可以找到包含HttpClient工具类代码,包括专门用于跳过SSL证书校验的工具类,这些代码可以作为参考,帮助你在实际项目中实现类似功能。
总结来说,WPF中的异步调用Web API通过HttpClient能确保应用程序的响应性和用户体验。通过正确配置和使用HttpClient,开发者可以高效地与Web API进行通信,处理数据请求和响应,同时避免主线程被阻塞。记住,良好的...
本篇文章将详细探讨如何使用HttpClient来访问Servlet,并阐述相关的核心知识点。 首先,我们需要理解Servlet的本质。Servlet是一种Java类,它扩展了服务器的功能,用于处理HTTP请求并生成响应。通常,Servlet部署在...
8. **SSL/TLS支持**:HttpClient 可以处理HTTPS连接,通过`SSLContext`和`SSLSocketFactory`可以自定义SSL/TLS配置,包括信任管理器和密钥库。 9. **响应处理**:HttpClient 提供了多种方式处理响应实体,如`...
本主题将深入探讨如何在Titanium框架中使用HttpClient访问REST服务,这对于构建跨平台的移动应用至关重要。 Titanium是一款JavaScript开发的开源移动应用框架,它允许开发者使用JavaScript编写原生iOS和Android应用...
- `SSLEnabled`: 启用SSL。 - `clientAuth`: 是否需要客户端验证,`false`表示不需要。 - `keystoreFile`: 指向KeyStore文件的位置。 - `keystorePass`: KeyStore的密码。 - `sslProtocol`: SSL/TLS协议版本,...
包含翻译后的API文档:httpclient-4.5.5-javadoc-API文档-中文(简体)版.zip 对应Maven信息:groupId:org.apache.httpcomponents,artifactId:httpclient,version:4.5.5 使用方法:解压翻译后的API文档,用...
本主题将深入探讨如何在这些客户端环境中利用HttpClient类来访问API,从而实现与远程服务器的数据交互。 HttpClient是.NET Framework 4.5及更高版本引入的一个强大工具,它为发送HTTP请求和接收响应提供了简洁、...
创建HttpClient实例是访问REST API的第一步: ```csharp using System.Net.Http; HttpClient client = new HttpClient(); ``` 三、发送GET请求 GET请求用于从服务器获取资源。使用HttpClient发送GET请求如下: ...
在实际部署时,应确保服务器配置了正确的证书,并启用严格的SSL/TLS验证。 这个Java程序包含了模拟HTTPS文件上传的核心逻辑,你可以根据实际需求调整URL、文件路径和参数。通过运行这个程序,你应该能够成功地在...
HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,...本文首先介绍 HTTPClient,然后根据作者实际工作经验给出了一些常见问题的解决方法。
### AndroidHttpClient访问Tomcat双向SSL验证服务器 #### 环境与背景介绍 本文主要讨论如何使用`AndroidHttpClient`访问`Tomcat`双向SSL验证服务器的相关技术和实施步骤。本项目的目标是在`Android WebView`上成功...
标题中的“使用httpClient访问https+443端口号”指的是使用Apache HttpClient库来发起HTTPS(安全超文本传输协议)请求,目标服务器的默认端口是443。HTTPS是一种基于SSL/TLS的安全通信协议,用于在客户端和服务器...