通过HTTPClient访问启用SSL的Quickr REST API

最近为客户做了一个程序使用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;
	}
}

 

你可能感兴趣的:(apache,浏览器,REST)