[Java]Http Get與Post函式2(HttpURLConnection)

序言

之前我發的一篇[Http Get與Post函式]中已經實現了可維持Session狀態的HTTP連線函式,但我發現了Apache提供的這個Client在Windows下會有連線數上限的問題(聽說好像調整XP連線數可以解決)。
另外,有的時候使用HTTP連線也不一定需要維持Session狀態,這時候其實就不需要另外加入Apache的http client的JAR。
因此我還是整理一下如果一個不維持Session狀態的HTTP Client連線怎麼達成。

函式原始碼

參數轉換函式
package common.control;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;

public class HTTPParseFunc {

/**
* hashMapToString
*
* @param map
* @param charset編碼
* ,如HTTP.UTF_8
* @return
* @throws UnsupportedEncodingException
*/
@SuppressWarnings("unchecked")
public static String hashMapToString(HashMap<String, String> map,
String charset) throws UnsupportedEncodingException {
StringBuffer result = new StringBuffer();
java.util.Iterator it = map.entrySet().iterator();
boolean isfirst = true;
while (it.hasNext()) {
java.util.Map.Entry entry = (java.util.Map.Entry) it.next();
if (isfirst) {
isfirst = false;
} else {
result.append("&");
}
result
.append(URLEncoder.encode(entry.getKey().toString(),
charset));
result.append("=");
result.append(URLEncoder.encode(entry.getValue().toString(),
charset));
}
return result.toString();
}
/**
* 將inputStream轉為String
*
* @param is
* inputStream
* @param charset
* 編碼,如HTTP.UTF_8
* @return inputStream的內容
* @throws UnsupportedEncodingException
*/
public static String inputStream2String(InputStream is, String charset)
throws UnsupportedEncodingException {
BufferedReader in = new BufferedReader(new InputStreamReader(is,
charset));
StringBuffer buffer = new StringBuffer();
String line = "";
try {
boolean isfirst = true;
while ((line = in.readLine()) != null) {
if (!isfirst) {
buffer.append("\n");
} else {
isfirst = false;
}
buffer.append(line);
}
} catch (IOException e) {
e.printStackTrace();
}

return buffer.toString();
}

/**
* HTTP 傳輸參數分割
* @param param 如name1=value1&name2=value2
* @return
* @throws UnsupportedEncodingException
*/
public static ArrayList<String[]> paramToArray(String param)
throws UnsupportedEncodingException {
ArrayList<String[]> arr = null;
String[] p = param.split("&");
if (param.toLowerCase().contains("&amp;")) {
ArrayList<String> p2 = new ArrayList<String>();
int j = 0;
for (int i = 0; i < p.length; i++) {
if (p[i].toLowerCase().startsWith("amp;")) {
p2.set(j - 1, p2.get(j - 1) + "&amp;" + p[i].substring(4));
j--;
}
p2.add(p[i]);
j++;
}
p2.toArray(p);
}

for (int i = 0; i < p.length; i++) {
String[] item = p[i].split("=");
if (item.length == 2) {
if (arr == null)
arr = new ArrayList<String[]>();
// item[0]=URLDecoder.decode(item[0],charset);
// item[1]=URLDecoder.decode(item[1],charset);
arr.add(item);
}
}
return arr;
}
}

連線參數模型
package common.model;

public class HTTPResponse {
String html=null;
Integer statusCode=null;
public String getHtml() {
return html;
}
public void setHtml(String html) {
this.html = html;
}
public Integer getStatusCode() {
return statusCode;
}
public void setStatusCode(Integer statusCode) {
this.statusCode = statusCode;
}
}


HTTP連線函式
package common;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.Proxy;
import java.net.URL;
import java.util.HashMap;

import common.control.HTTPParseFunc;
import common.model.HTTPResponse;



public class HTTPBaseIO2 {
public enum Method {
get, post
}
/**
* 送出Request
* @param urlpath URL
* @param method HTTPBaseIO2.Method.get/post
* @param params HashMap<Name, Value>
* @param charset UTF-8
* @param timeout 連線逾時null:不設限/millisecond
* @return 回傳的html
* @throws UnsupportedEncodingException
*/
public static HTTPResponse doSend(String urlpath, Method method,
HashMap<String, String> params, String charset,boolean isAutoRedirect, Integer timeout,Proxy proxy) throws UnsupportedEncodingException {
HTTPResponse result=new HTTPResponse();
String param=null;
if(params!=null){
param=HTTPParseFunc.hashMapToString(params, charset);
}
if(method==Method.post){
result=sendPost(urlpath,param,charset,isAutoRedirect,timeout,proxy);
}else{
result=sendGet(urlpath,param,charset,isAutoRedirect,timeout,proxy);
}
return result;
}
/**
* 向指定URL發送GET方法的請求
*
* @param url
* 發送請求的URL
* @param param
* 請求參數,請求參數應該是name1=value1&name2=value2的形式。
* @return URL所代表遠程資源的響應
*/
public static HTTPResponse sendGet(String url, String params, String charset,boolean isAutoRedirect, Integer timeout,Proxy proxy) {
HTTPResponse result=new HTTPResponse();
HttpURLConnection conn=null;
BufferedReader in = null;
try {
String urlName = url;
if(params!=null) urlName+= "?" + params;
URL realUrl = new URL(urlName);

HttpURLConnection.setFollowRedirects(isAutoRedirect);
// 打開和URL之間的連接
if(proxy!=null)
conn = (HttpURLConnection)realUrl.openConnection(proxy);
else
conn = (HttpURLConnection)realUrl.openConnection();
if(timeout!=null) conn.setConnectTimeout(timeout);
// 設置通用的請求屬性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
// 建立實際的連接
conn.connect();
result.setHtml(HTTPParseFunc.inputStream2String(conn.getInputStream(), charset));
} catch (Exception e) {
e.printStackTrace();
result=null;
}
// 使用finally塊來關閉輸入流
finally {
try {
if (conn != null){
if(conn.getResponseCode()!=HttpURLConnection.HTTP_OK)
result=null;
result.setStatusCode(conn.getResponseCode());
}
} catch (Exception e) {
}
try {
if (in != null) {
in.close();
}
if (conn != null){
conn.disconnect();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}

/**
* 向指定URL發送POST方法的請求
*
* @param url
* 發送請求的URL
* @param param
* 請求參數,請求參數應該是name1=value1&name2=value2的形式。
* @return URL所代表遠程資源的響應
*/
public static HTTPResponse sendPost(String url, String params, String charset,boolean isAutoRedirect, Integer timeout,Proxy proxy) {
HTTPResponse result=new HTTPResponse();
PrintWriter out = null;
BufferedReader in = null;
HttpURLConnection conn=null;
try {
URL realUrl = new URL(url);
// 打開和URL之間的連接

HttpURLConnection.setFollowRedirects(isAutoRedirect);
if(proxy!=null)
conn = (HttpURLConnection)realUrl.openConnection(proxy);
else
conn = (HttpURLConnection)realUrl.openConnection();
if(timeout!=null) conn.setConnectTimeout(timeout);
// 設置通用的請求屬性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
// 發送POST請求必須設置如下兩行
conn.setDoOutput(true);
conn.setDoInput(true);
// 獲取URLConnection對象對應的輸出流
out = new PrintWriter(conn.getOutputStream());
// 發送請求參數
if(params!=null) out.print(params);
// flush輸出流的緩衝
out.flush();
result.setHtml(HTTPParseFunc.inputStream2String(conn.getInputStream(), charset));

} catch (Exception e) {
e.printStackTrace();
result=null;
}
// 使用finally塊來關閉輸出流、輸入流
finally {
try {
if (conn != null){
if(conn.getResponseCode()!=HttpURLConnection.HTTP_OK)
result=null;
result.setStatusCode(conn.getResponseCode());
}
} catch (Exception e) {
}
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
if (conn != null){
conn.disconnect();
}
}
return result;
}


}

使用範例程式

package common.test;

import java.util.HashMap;


import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import common.HTTPBaseIO2;
import common.model.HTTPResponse;

public class HTTPBaseIO2Test {

@Before
public void setUp() throws Exception {
}

@After
public void tearDown() throws Exception {
}

@Test
public void testDoGet() {
String urltest = "http://localhost:8080/Test/Test1" ;
String charset="UTF-8";
HashMap<String, String> params=new HashMap<String, String>();
try {
params.put("val", "測試&測試");
HTTPResponse html=HTTPBaseIO2.doSend(urltest, HTTPBaseIO2.Method.get, params, charset,true,null,null);
System.out.println("testDoGet:"+html.getHtml());
} catch (Exception e) {
e.printStackTrace();
}
}

@Test
public void testDoPost() {
String urltest = "http://localhost:8080/Test/Test1" ;
String charset="UTF-8";
HashMap<String, String> params=new HashMap<String, String>();
try {
params.put("val", "測試1&測試1");
HTTPResponse html=HTTPBaseIO2.doSend(urltest, HTTPBaseIO2.Method.post, params, charset,true,null,null);
System.out.println("testDoPost:"+html.getHtml());
params.clear();
params.put("val", "測試2&測試2");
html=HTTPBaseIO2.doSend(urltest, HTTPBaseIO2.Method.post, params, charset,true,null,null);
System.out.println("testDoPost:"+html.getHtml());
} catch (Exception e) {
e.printStackTrace();
}
}

}

[CentOS]JBoss5.1安裝

序言

此篇簡單的記錄JBoss在CentOS的安裝步驟。

環境

安裝步驟

  1. 官方網站下載JBoss的5.1.0版的zip檔如[jboss-5.1.0.GA.zip]
  2. 到[/usr/local/]目錄下解壓縮這個zip檔
    #cd /usr/local/
    #unzip jboss-5.1.0.GA.zip
  3. 建立環境變數[JBOSS_HOME],在這邊有兩種方式選一種來就可以了
    • 修改[/etc/profile],可以用如[vi /etc/profile]命令修改,增加已下內容在最後一行:
      export JBOSS_HOME=/usr/local/jboss-5.1.0.GA
      export PATH=$PATH:$JBOSS_HOME/bin
    • 建立一個[jboss.sh]在[/etc/profile.d]目錄,如[vi /etc/profile.d/jboss.sh],內容如下:
      JBOSS_HOME=/usr/local/jboss-5.1.0.GA
      PATH=$PATH:$JBOSS_HOME/bin
      export JBOSS_HOME PATH
  4. 登出再登入OS
  5. 執行JBoss看看有沒有辦法啟動,測試網址為http://localhost:8080/
    #sh $JBOSS_HOME/bin/run.sh -b 0.0.0.0
    • 如果看到以下錯誤訊息而無法啟動,試著修改[/usr/local/jboss-5.1.0.GA/bin/run.conf]這個檔案中的 java [-Xmx]與[-XX:MaxPermSize]這兩個參數的大小
      Error occurred during initialization of VM
      Could not reserve enough space for object heap
      Could not create the Java virtual machine.
  6. 如果要將JBoss已背景方式執行,並在OS啟動時自動啟動,可參考 http://community.jboss.org/wiki/startjbossonbootwithlinuxhttp://amjet.dyndns.biz/blog/IT/?p=297
    • 增加jboss帳號與修改目錄權限
      #useradd jboss
      #cd /usr/local/jboss-5.1.0.GA
      #chmod -R 700 ./
    • 修改[/usr/local/jboss-5.1.0.GA/bin/run.conf]檔,將以下內容加在最後一行
      JAVA_HOME=/usr/java/latest
      JBOSS_HOME=/usr/local/jboss-5.1.0.GA
      JBOSS_HOST=0.0.0.0
      JAVAPTH=/usr/java/latest
    • 修改[/usr/local/jboss-5.1.0.GA/bin/jboss_init_redhat.sh]檔,將以下內容加在第一行
      . /usr/local/jboss-5.1.0.GA/bin/run.conf
    • 修改[/etc/rc.local]檔,將以下內容加在最後一行
      /usr/local/jboss-5.1.0.GA/bin/jboss_init_redhat.sh start
    • 如果你想開啟/關閉JBoss就執行以下命令
      /usr/local/jboss-5.1.0.GA/bin/jboss_init_redhat.sh start
      /usr/local/jboss-5.1.0.GA/bin/jboss_init_redhat.sh stop

[CentOS]JDK(Java)安裝

序言

此篇簡單的記錄JDK在CentOS的安裝步驟,下一篇將會搭配這個Java環境安裝JBoss。

環境

安裝步驟

  1. 官方網站下載JDK的Linux版的RPM檔如[jdk-6u20-linux-i586-rpm.bin]
  2. 執行安裝命令[sh jdk-6u20-linux-i586-rpm.bin],此時會要求你同意授權條件。安裝完成後預設的安裝路徑會帶版號,如[/usr/java/jdk1.6.0_20]。建立一個jdk的目錄連結。
    #sh jdk-6u20-linux-i586-rpm.bin
    #cd /usr/local
    #ln –s /usr/java/jdk1.6.0_20 jdk
  3. 將此JVM加入系統可用Java
    #alternatives --install /usr/bin/java java /usr/java/latest 99
  4. 修改系統預設Java,執行此命令會要你選擇可用的Java編號
    #alternatives --config java
  5. 輸入已下命令確認是否有出現JAVA版本
    #java –version
  6. 建立環境變數[JAVA_HOME],在這邊有兩種方式選一種來就可以了
    • 修改[/etc/profile],可以用如[vi /etc/profile]命令修改,內容如下:
      export JAVA_HOME=/usr/java/latest
      export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
      export PATH=$PATH:$JAVA_HOME/bin
    • 建立一個[java.sh]在[/etc/profile.d]目錄,如[vi /etc/profile.d/java.sh],內容如下:
      JAVA_HOME=/usr/java/latest
      CLASSPATH=.:$JAVA_HOME/lib.tools.jar
      PATH=$JAVA_HOME/bin:$PATH
      export JAVA_HOME CLASSPATH PATH
  7. 登出再登入OS
  8. 輸入已下命令確認是否有出現環境變數值
    #echo $JAVA_HOME

[CentOS]MySQL安裝

序言

我依據我自己的環境記錄下我的安裝步驟以供自己參考。

環境

安裝步驟

  1. 官方網站下載MySQL的Linux版的TAR檔如[mysql-5.1.45-linux-i686-glibc23.tar.gz]
  2. 依據官方安裝步驟如下,執行最後一步會啟動MySQL
    #groupadd mysql
    #useradd -g mysql mysql
    #cd /usr/local
    #gunzip < /path/to/mysql-5.1.45-linux-i686-glibc23.tar.gz | tar xvf -
    #ln -s /usr/local/mysql-5.1.45-linux-i686-glibc23 mysql
    #cd mysql
    #chown -R mysql .
    #chgrp -R mysql .
    #scripts/mysql_install_db --user=mysql
    #chown -R root .
    #chown -R mysql data
    #bin/mysqld_safe --user=mysql &
  3. 如果有其他非本機的Client要連現這台DB需建立帳號,如果不綁IP安全性(代表從任何IP都能以該帳號連線)的帳號建立方式如下
    • 進入mysql命令模式
      # /usr/local/mysql/bin/mysql -u root
    • 建立帳號
      mysql>grant all on *.* to 帳號@ identified by '密碼' with grant option;
      mysql>FLUSH PRIVILEGES;
      mysql>quit;
  4. 關閉MySQL
    #/usr/local/mysql/bin/mysqladmin -u root shutdown
  5. 啟動MySQL
    #/usr/local/mysql/bin/mysqld_safe &
  6. 資料庫參數設定檔應該是在/etc/my.cnf,如果沒有可以從/usr/local/mysql-5.1.45-linux-i686-glibc23/support-files底下的*.cnf中挑適合的放在/etc/my.cnf
    • my-innodb-heavy-4G.cnf: 這是一個針對 4G RAM(主要運行只有 InnoDB 表的 MySQL 並使用幾個連接數執行複雜的查詢)。
    • my-huge.cnf: 適合 1GB - 2GB RAM的主機使用。
    • my-large.cnf: 適合 512MB RAM的主機使用。
    • my-medium.cnf: 只有 32MB - 64MB RAM 的主機使用,或者有 128MB RAM 但需要運行其他伺服器,例如 web server。
    • my-small.cnf: 記憶體少於 64MB 時適用這個,MySQL 會佔用較少資源。
  7. 將MySQL設為在OS啟動時自動啟動
    #cp /usr/local/mysql-5.1.45-linux-i686-glibc23/support-files/mysql.server /etc/rc.d/init.d/mysqld
    #chmod 700 /etc/init.d/mysqld
    #chkconfig --add mysqld
    #chkconfig --level 345 mysqld on
    

[4Shared]網路硬碟上傳下載教學(Desktop程式版)

序言

幾年前曾經為了分享照片給別人,所以我曾經開發過一個FriendShare的網站。
不過當時是因為自己有個上傳速度夠快的環境所以架站很方便,這個網站也隨著這樣的環境消失而消失了。
後來我找了幾個免費的網路硬碟服務想看看有沒有能方便使用,限制的部份與我的使用習慣較不抵觸的環境,但一直都沒有結論。
最近分享照片時我心血來潮又找了一回,發現4shared的網路評價不錯,限制又比較符合我所想的。
除了網頁上傳下載外,它自己也有提供上傳下載的程式可用(連手機版的都有,可惜還沒有Android版)~
我試了一下還滿好用的,不過網路上對程式版使用這部份的網路教學好像沒看到,所以我就乾脆自己寫。
希望有要分享照片的朋友能學會使用,以後就不用MSN傳半天傳不到我手裡了。

以下我分成三部份來跟大家介紹這個網路硬碟的桌面程式使用方式

服務限制

在大家很開心的分享檔案之前,我建議還是要看一下免費帳號的限制,免得被砍帳號都不知道:
  • 三十天內沒登入,你就會被砍帳號與檔案。只要你沒被砍帳號,檔案都有效~
    (基本上我想分享檔案後30天內大概想要檔案的人都抓完了,所以真的被砍帳號下回要分享時再申請一次帳號就不成問題了)
  • 空間限制:每個帳號10G,上傳的一個檔案上限200MB(付費帳號就不同了)
完整內容請參考官方的使用條款

桌面程式安裝與帳號申請


http://www.4shared.com/首頁的下載4shared 桌面程式,下載完後開使安裝

安裝過程中有出現是不是要安裝Tool bar,這個看個人,我圖上的操作是不安裝

安裝完成後啟動程式

程式剛啟動時回讓你選【我是4Shared新手】,就是要註冊一個帳號。註冊時選擇計劃【Free】就是免費帳號

或是你已經有帳號就選登錄現有帳戶。
登入成功後,會顯示使用提示,然後告訴你它有個同步用的資料夾讓你可以指定,這些看看就選跳過與結束就可以了,這看個人使用需求自己玩玩看吧。

上傳教學


上傳的時候壓縮時選一下分割檔為200Mb,這樣上傳才不會失敗。
然後在右下角的上傳區選擇要上傳的檔案(也可以點upload鈕選檔案或目錄)
選好檔案就會看到它開始上傳了
上傳完成就會出現在上面的區塊,這時想要把上傳的檔案分享給別人,只要右鍵選獲得鍊結
然後選擇下面的連結,再點複製,就會得到檔案連結,就可以把這個下載連結告訴要分享的人囉。

下載教學

(最近發現JDownloader這個工具可以很方便的下載4Shared的檔案,教學與下載文可參考[下載&教學] JDownloader 0.9.581 中文免安裝版 ~ 最強的免費空間下載器 by 海芋)
拿到別人分享的連結一打開,就會出現這個畫面。這時你有兩種下載的方式:
第一種就是選【現在下載】(這個方式要等倒數,沒耐心請直接往下看第二種方式)
就會進到一個倒數的畫面
倒數結束就會出現【現在下載檔案】可以點選下載。
第二種就是點選加到我的帳戶(如果檔案本來就是你的就沒這項,你就直接到程式介面就能下載了)
然後沒登入的話就會要你登入,登入後會看到一個網頁版的檔案管理畫面,不過我們要下載是用程式下載,所以回到桌面程式畫面。
這時如果你的檔案中沒出現剛才的檔案就右鍵選單選【Reflash】
然後就可以選想下載的檔案來下載了。
第一次下載會問你要下載到哪
這就是下載中的樣子

總結

上手後就超簡單的,當然如果不安裝桌面程式的人也可以用網頁登入管理檔案或是找免安裝版的來用

相關連結

這裡是關於技術的手札~

也歡迎大家到

倫與貓的足跡



到噗浪來

關心一下我唷!
by 倫
 
Copyright 2009 倫倫3號Beta-Log All rights reserved.
Blogger Templates created by Deluxe Templates
Wordpress Theme by EZwpthemes