Tag: 隨手筆記
Java – 使用 HttpClient 的 HttpGet 來取得網頁內容
by GDX on 十二月.10, 2009, under Java, 程式設計
在用 HttpGet 取得網頁內容時使用了以下的程式碼
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet("http://localhost/");
HttpResponse response = httpclient.execute(httpget);
HttpEntity ent = response.getEntity();
if (ent != null) {
int len;
char[] tmp = new char[2048];
BufferedReader br = new BufferedReader(new InputStreamReader(ent.getContent()));
StringBuffer sb = new StringBuffer();
while ((len = br.read(tmp)) != -1)
{
sb.append(tmp);
}
}
return sb.toString();
卻發現這樣取得到的內容不完整,將讀取出來的內容存成文字檔觀看後,發現有很多斷點不正確的地方。
於是用 Sniffer 觀看封包內容發現網路傳輸也都正常 ,於是將正常的內容和不正確的內容做了比對;
經過比對後,發現不正確的資訊中有著許多重複的地方。
因此再重回 Debug 模式觀看 len 和 tmp 的內容變化,發現 len 的數值並不是每次都在最大值(2048)
這代表著每次執行 br.read(tmp) 的時候,並不是每次都讀取到 tmp 的最大值
於是將讀取的地方改為
while ((len = br.read(tmp, 0, 2048)) != -1)
{
sb.append(tmp);
}
結果也是相同,由此可知 br.read(tmp) 並沒有每次都讀取出來 tmp.length 的長度的資料
因此最終改為以下程式碼得以解決:
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet("http://localhost/");
HttpResponse response = httpclient.execute(httpget);
HttpEntity ent = response.getEntity();
if (ent != null) {
int len;
char[] tmp = new char[2048];
BufferedReader br = new BufferedReader(new InputStreamReader(ent.getContent()));
StringBuffer sb = new StringBuffer();
while ((len = br.read(tmp)) != -1)
{
sb.append(String.valueOf(tmp).substring(0, len));
}
}
return sb.toString();
如果有更好的解法以及會有這種情況的原因歡迎交流
Java – 利用 HttpClient 執行 Http 請求
by GDX on 十二月.10, 2009, under Java, 程式設計
網路上有很多 Java 的 Http 相關 Library
這裡選用 HttpClient 的原因是 Google 的 Android 系統裡用的就是 HttpClient
如此一舉兩得,何樂而不為XD
HttpClient是需要另外下載的 Library,首先先到 http://hc.apache.org/下載 HttpClient 和 HttpCore 解開來加到專案中
如此就可以使用 HttpClient 來執行 Http 請求囉,以下為簡單的 HttpGet 範例
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet("http://localhost/");
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
int l;
byte[] tmp = new byte[2048];
while ((l = instream.read(tmp)) != -1) {
}
}
補充:
若是在 compile 的時候 compilier 說找不到 net.jcip.annotations.GuardedBy
到 http://jcip.net/ 下載 jcip-annotation.jar 就可以解決
補充2:
compile 時找不到
org.apache.common.logging
到 這裡下載 Logging
SQL – 分頁
by GDX on 十二月.09, 2009, under SQL, 心情日記, 資料庫
以前還沒有那麼熟SQL語法的時候
只會作將資料庫資料讀出來、寫入、更新等等基本的動作,以為這就是SQL的全部了
後來作的東西越來越多、看的越來越多,經驗也比以前豐富了
發現SQL真是博大精深,很多複雜的動作都可以在SQL裡完成
而不需要將資料讀出再交由程式作處理,也減少了程式的複雜度
例如最常用到的分頁,以前總想著把資料全部讀出來再用程式選取需要的資料
但這樣實在太浪費校能和記憶體了
資料量小倒是還好,當資料量一大,成千上萬筆的資料不可能一次選出
因此在此做了筆記
範例資料表名稱: a
範例資料表結構:
id: 主索引
data: 資料
利用以下語法即可達到不需程式控制的分頁技巧
SELECT TOP pSize * FROM [a]
WHERE [a].[id] NOT IN
(SELECT TOP pSize * pIndex [b].[id] FROM [a] AS [b] ORDER BY [b].[id])
ORDER BY [a].[id] DESC
pSize代表一頁的資料筆數
pIndex代表目前的頁面(從0開始)
PHP – 取得Http Content Data
by GDX on 十二月.09, 2009, under PHP, 程式設計
在ASP.NET的時候會將上傳的檔案以自己的方式作處理
用BinaryReader從Request.InputStream讀出來Content Data
在 PHP 的方法則是使用 php://input
即可讀取出Content Data作後續處理
還有一些有用的參數
- php://stdin
- php://stdout
- php://stderr
- php://output
- php://input
- php://filter
利用http protocal直接取得GoogleMaps的圖片
by GDX on 十二月.09, 2009, under 心情日記
GoogleMaps 目前並未有公開提供給應用程式的API
之前在使用手機上網的時候發現了GoogleMaps的手機網頁版本是直接顯示地圖圖片的
因此大致看了一下上面的圖片網址,發現可以直接透過輸入網址來取圖
參數說明:
Point=b和Point=e:代表一個點的開始和結尾
Point.latitude_e6:緯度 (無小數點,小數取到第六位)
Point.longitude_e6:經度(無小數點,小數取到第六位)
w:取得的圖片寬度
h:取得的圖片高度
cc:目前好像沒用
min_priority:試著去改過,不過好像沒什麼作用
client:照著輸入即可
zl:縮放比例 (0~17)
zm:應該是Zoom Meter,計算方式為 (zl + 1) * w