Posted on 2008-06-11 15:18
寒武紀 閱讀(6927)
評論(8) 編輯 收藏 所屬分類:
Java
Jakarta的httpclient3.1是最新版本,項目中需要用程序模擬瀏覽器的GET和POST動作。在使用過程中遇到不少問題。
1. 帶附件的POST提交
最開始都是使用MultipartPostMethod這個類,現在已經廢棄這個類了。API說明:Deprecated. Use MultipartRequestEntity
in conjunction with PostMethod
instead. 使用PostMethod可以實現的功能,就沒有必要再弄一個MultipartPostMethod了。下面是一段最簡單的示例:
PostMethod post = new PostMethod();
NameValuePair[] pairs = new NameValuePair[2];
pairs[0] = new NameValuePair("para1", "value1");
pairs[0] = new NameValuePair("para2", "value2");
post.setRequestBody(pairs);
HttpClient client = new HttpClient();

try
{
client.executeMethod(post);

} catch (HttpException e)
{
e.printStackTrace();

} catch (IOException e)
{
e.printStackTrace();
}
這是針對一般的form形式的提交,而且這個form里面不帶附件的。如果帶附件,那么這種方法就不起作用,附件上傳的參數和普通參數無法一同在服務器獲取到。
org.apache.commons.httpclient.methods.multipart 這個包就是為處理文件上傳這種多形式參數的情況的。最主要的類是Part(代表一種post object),它有二個比較重要的子類:FilePart和StringPart,一個是文件的參數,另一個就是普通的文本參數。它的典型使用方法如下:
String url = "http://localhost:8080/HttpTest/Test";
PostMethod postMethod = new PostMethod(url);
StringPart sp = new StringPart("TEXT", "testValue");
FilePart fp = new FilePart("file", "test.txt", new File("./temp/test.txt"));

MultipartRequestEntity mrp= new MultipartRequestEntity(new Part[]
{sp, fp}, postMethod
.getParams());
postMethod.setRequestEntity(mrp);
//執行postMethod
HttpClient httpClient = new HttpClient();

try
{
httpClient.executeMethod(postMethod);

} catch (HttpException e)
{
e.printStackTrace();

} catch (IOException e)
{
e.printStackTrace();
}
在第二行PostMethod postMethod = new PostMethod();后面,有人說需要使用postMehtod.setRequestHeader("Content-type", "multipart/form-data"); Content-type的請求類型進行更改。但是我在使用過程沒有加上這一句,查了一下httpCleint的默認Content-type是application/octet-stream。應該是沒有影響的。對于MIME類型的請求,httpclient建議全用MulitPartRequestEntity進行包裝,就是上面的用法。
2. 參數中文的處理問題
httpclient的默認編碼都是ISO-8859-1,那肯定就無法支持中文參數了。引用一下這篇文章:
http://thinkbase.net/w/main/Wiki?HttpClient+POST+%E7%9A%84+UTF-8+%E7%BC%96%E7%A0%81%E9%97%AE%E9%A2%98 ,按照作者的說法,就可以正常解決中文編碼的問題。其中最關鍵的是修改EncodingUtil這個類的一個方法實現。另外,FilePart和StringPart的構造方法都有一個帶編碼指定的參數,為了減少問題的出現,建議所有的都帶上統一的編碼,包括postMethod.getParams()。示例如下:
String url = "http://localhost:8080/HttpTest/Test";
PostMethod postMethod = new PostMethod(url);
StringPart sp = new StringPart("TEXT", "testValue", "GB2312");
FilePart fp = new FilePart("file", "test.txt", new File("./temp/test.txt"), null, "GB2312");
postMethod.getParams().setContentCharset("GB2312");

MultipartRequestEntity mrp= new MultipartRequestEntity(new Part[]
{sp, fp}, postMethod
.getParams());
postMethod.setRequestEntity(mrp);
//執行postMethod
HttpClient httpClient = new HttpClient();

try
{
httpClient.executeMethod(postMethod);

} catch (HttpException e)
{
e.printStackTrace();

} catch (IOException e)
{
e.printStackTrace();
}
剛進場的時候戲就落幕