/*
* This software is distributed under the terms of the FSF
* Gnu Lesser General Public License (see lgpl.txt).
*
* This program is distributed WITHOUT ANY WARRANTY. See the
* GNU General Public License for more details.
*/
package com.scooterframework.common.http;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpHead;
import org.apache.http.client.methods.HttpOptions;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
/**
* HTTPClient class acts as a HTTP client.
*
* @author (Fei) John Chen
*
*/
public class HTTPClient {
public static final String GET = "GET";
public static final String POST = "POST";
public static final String PUT = "PUT";
public static final String DELETE = "DELETE";
public static final String HEAD = "HEAD";
public static final String OPTIONS = "OPTIONS";
private HttpClient httpclient;
public HTTPClient() {
startUp();
}
/**
* Creates a HTTP client.
*/
public void startUp() {
httpclient = new DefaultHttpClient();
}
/**
* Shuts down the HTTP client.
*/
public void shutDown() {
httpclient.getConnectionManager().shutdown();
}
/**
* Sends a HTTP GET request
*
* @param uri the request uri
* @return an HTTPResponse instance
*/
public HTTPResponse fireHttpGetRequest(String uri) {
return fireHttpRequest(HTTPClient.GET, uri);
}
/**
* Sends a HTTP POST request
*
* @param uri the request uri
* @return an HTTPResponse instance
*/
public HTTPResponse fireHttpPostRequest(String uri) {
return fireHttpRequest(HTTPClient.POST, uri);
}
/**
* Sends a HTTP POST request
*
* @param uri the request uri
* @param params parameters to send with the request
* @return an HTTPResponse instance
*/
public HTTPResponse fireHttpPostRequest(String uri, Map<String, String> params) {
return fireHttpRequest(HTTPClient.POST, uri, params);
}
/**
* Sends a HTTP PUT request
*
* @param uri the request uri
* @return an HTTPResponse instance
*/
public HTTPResponse fireHttpPutRequest(String uri) {
return fireHttpRequest(HTTPClient.PUT, uri);
}
/**
* Sends a HTTP PUT request
*
* @param uri the request uri
* @param params parameters to send with the request
* @return an HTTPResponse instance
*/
public HTTPResponse fireHttpPutRequest(String uri, Map<String, String> params) {
return fireHttpRequest(HTTPClient.PUT, uri, params);
}
/**
* Sends a HTTP DELETE request
*
* @param uri the request uri
* @return an HTTPResponse instance
*/
public HTTPResponse fireHttpDeleteRequest(String uri) {
return fireHttpRequest(HTTPClient.DELETE, uri);
}
/**
* Sends a HTTP HEAD request
*
* @param uri the request uri
* @return an HTTPResponse instance
*/
public HTTPResponse fireHttpHeadRequest(String uri) {
return fireHttpRequest(HTTPClient.HEAD, uri);
}
/**
* Sends a HTTP OPTIONS request
*
* @param uri the request uri
* @return an HTTPResponse instance
*/
public HTTPResponse fireHttpOptionsRequest(String uri) {
return fireHttpRequest(HTTPClient.OPTIONS, uri);
}
/**
* Sends a HTTP request.
*
* @param method a HTTP method
* @param uri request uri
* @return an HTTPResponse instance
*/
public HTTPResponse fireHttpRequest(String method, String uri) {
return fireHttpRequest(method, uri, null);
}
/**
* Sends a HTTP request with parameters.
*
* Please note that the <tt>params</tt> parameter is only useful for
* requests using <tt>POST</tt> and <tt>PUT</tt> method.
*
* @param method a HTTP method
* @param uri request uri
* @param params request parameters
* @return an HTTPResponse instance
*/
public HTTPResponse fireHttpRequest(String method, String uri,
Map<String, String> params) {
if (method == null || "".equals(method))
throw new IllegalArgumentException("method cannot be null or empty.");
if (uri == null || "".equals(uri))
throw new IllegalArgumentException("uri cannot be null or empty.");
HttpUriRequest request = null;
HttpResponse response = null;
try {
request = createHttpRequest(method, uri, params);
response = httpclient.execute(request);
} catch (Throwable ex) {
String error = (request != null)?request.getRequestLine().toString():uri;
throw new HTTPRequestError("Failed in request \""
+ error + "\"; details: "
+ ex.getMessage());
}
return new HTTPResponse(response);
}
private HttpUriRequest createHttpRequest(String method, String uri, Map<String, String> params) throws UnsupportedEncodingException {
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
if (params != null) {
for (Map.Entry<String, String> entry : params.entrySet()) {
nvps.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
}
}
HttpUriRequest request = null;
if (GET.equalsIgnoreCase(method)) {
request = new HttpGet(uri);
} else if (POST.equalsIgnoreCase(method)) {
request = new HttpPost(uri);
((HttpPost)request).setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
} else if (PUT.equalsIgnoreCase(method)) {
request = new HttpPut(uri);
((HttpPut)request).setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
} else if (DELETE.equalsIgnoreCase(method)) {
request = new HttpDelete(uri);
} else if (HEAD.equalsIgnoreCase(method)) {
request = new HttpHead(uri);
} else if (OPTIONS.equalsIgnoreCase(method)) {
request = new HttpOptions(uri);
} else {
throw new IllegalArgumentException("Method \"" + method
+ "\" is not supported.");
}
return request;
}
}