關(guān)于http協(xié)議------HttpServlet扭倾、HttpClient、URLConnection的關(guān)系

記錄一次HTTP相關(guān)內(nèi)容的學(xué)習(xí)

關(guān)于HttpServlet

在大多數(shù)的Web應(yīng)用程序中挽绩,客戶端都是通過Http協(xié)議去訪問服務(wù)器端的資源膛壹,而我們編寫的Servlet主要是用于Http協(xié)議的請(qǐng)求和響應(yīng)處理。為了快速開發(fā)應(yīng)用于Http協(xié)議的Servlet類唉堪,Sun公司在javax.servlet.http包中提供了一個(gè)抽象類HttpServlet模聋,它繼承于GenericServlet,用于創(chuàng)建適合基于Http協(xié)議的Web Servlet唠亚。創(chuàng)建一個(gè)HTTPservlet必須繼承HttpServlet類链方,并且重寫里面的doGet,doPost方法灶搜。祟蚀。。割卖。

創(chuàng)建一個(gè)servlet用于處理請(qǐng)求?

public class ThreeServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

System.out.println("這是GET方式發(fā)送的請(qǐng)求,Servlet使用doGet()方法來處理.");

}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

System.out.println("這是POST方式發(fā)送的請(qǐng)求,Servlet使用doPost()方法來處理.");

}

}

HttpClient和HttpURLConnection

簡(jiǎn)單來說前酿,HttpClient就是一個(gè)增強(qiáng)版的HttpURLConnection,HttpURLConnection可以做的事情HttpClient全部可以做鹏溯;HttpURLConnection沒有提供的有些功能罢维,HttpClient也提供了,但它只是關(guān)注于如何發(fā)送請(qǐng)求剿涮、接收響應(yīng)言津,以及管理HTTP連接攻人。

使用HttpClient發(fā)送請(qǐng)求取试、接收響應(yīng)很簡(jiǎn)單,只要如下幾步即可:?

1.創(chuàng)建HttpClient對(duì)象怀吻。?

2.如果需要發(fā)送GET請(qǐng)求,創(chuàng)建HttpGet對(duì)象;如果需要發(fā)送POST請(qǐng)求拄养,創(chuàng)建HttpPost對(duì)象。?

3.如果需要發(fā)送請(qǐng)求參數(shù)磅叛,可調(diào)用HttpGet、HttpPost共同的setParams(HetpParams params)方法來添加請(qǐng)求參數(shù)萨赁;對(duì)于HttpPost對(duì)象而言弊琴,也可調(diào)用setEntity(HttpEntity entity)方法來設(shè)置請(qǐng)求參數(shù)。?

4.調(diào)用HttpClient對(duì)象的execute(HttpUriRequest request)發(fā)送請(qǐng)求杖爽,執(zhí)行該方法返回一個(gè)HttpResponse敲董。?

5.調(diào)用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可獲取服務(wù)器的響應(yīng)頭慰安;調(diào)用HttpResponse的getEntity()方法可獲取HttpEntity對(duì)象腋寨,該對(duì)象包裝了服務(wù)器的響應(yīng)內(nèi)容。程序可通過該對(duì)象獲取服務(wù)器的響應(yīng)內(nèi)容化焕。?

public classHttpClientTest{

publicString doPost(String url, String params) {

CloseableHttpClient httpClient = HttpClients.createDefault();//創(chuàng)建Httpclient對(duì)象

HttpPost httpPost =newHttpPost(url);//創(chuàng)建HttpPost對(duì)象

httpPost.setHeader("Accept","application/xml");

httpPost.setHeader("Content-Type","application/xml");

String charSet ="UTF-8";

StringEntity entity =newStringEntity(params, charSet);

httpPost.setEntity(entity);//使用setEntity方法來設(shè)置請(qǐng)求參數(shù)

CloseableHttpResponse response =null;

try{

response = httpClient.execute(httpPost);//調(diào)用httpclient對(duì)象的execute發(fā)送請(qǐng)求萄窜,執(zhí)行方法返回一個(gè)httpresponse

StatusLine status = response.getStatusLine();

intstate = status.getStatusCode();

if(state == HttpStatus.SC_OK) {

HttpEntity responseEntity = response.getEntity();//調(diào)用httpResponse的getEntity方法可獲得httpEntity對(duì)象,程序可通過該對(duì)象獲取服務(wù)器的響應(yīng)內(nèi)容

String xmlString = EntityUtils.toString(responseEntity);

returnxmlString;

}else{

System.out.println("請(qǐng)求返回:"+ state +"("+ url +")");

}

}catch(Exception e) {

e.printStackTrace();

}finally{

if(response !=null){

try{

response.close();

}catch(IOException e) {

e.printStackTrace();

}

}

try{

httpClient.close();

}catch(IOException e) {

e.printStackTrace();

}

}

return null;

}

public static voidmain(String[] args)throwsUnsupportedEncodingException {

String url ="http://172.21.65.253/sessions";

HttpClientTest client =newHttpClientTest();

String result = client.doPost(url,"paramString");

System.out.println("URL:");

System.out.println(" "+url);

System.out.println("請(qǐng)求:");

System.out.println(" "+params);

System.out.println("響應(yīng):");

System.out.println(" "+result);

}

}

使用HttpURLConnection發(fā)送HTTP請(qǐng)求

public static String requestContentWithGet(String urlStr) {

String content = null;

if (urlStr != null && urlStr.startsWith("http://")) {

URL url = null;

HttpURLConnection conn = null;

try {

url = new URL(urlStr);

conn = (HttpURLConnection) url.openConnection();

conn.setDoOutput(true); //設(shè)置是否向conn輸出撒桨,因?yàn)檫@個(gè)是post請(qǐng)求查刻,參數(shù)要放在http正文內(nèi),因此需要設(shè)為true, 默認(rèn)情況下是false

conn.setDoInput(true); //設(shè)置是否從conn讀入凤类,默認(rèn)情況下是true

conn.setUseCaches(false); //Post請(qǐng)求不能使用緩存

conn.setRequestMethod("POST"); // 設(shè)定請(qǐng)求的方法為"POST"赖阻,默認(rèn)是GET

conn.setConnectTimeout(6*1000); //設(shè)置連接主機(jī)超時(shí)

conn.setReadTimeout(6*1000); //設(shè)置從主機(jī)讀取數(shù)據(jù)超時(shí)

conn.setRequestProperty("Content-type", "application/x-java-serialized-object"); //設(shè)定傳送的內(nèi)容類型是可序列化的java對(duì)象,(如果不設(shè)此項(xiàng),在傳送序列化對(duì)象時(shí),當(dāng)WEB服務(wù)默認(rèn)的不是這種類型時(shí)可能拋java.io.EOFException)

conn.setRequestProperty("accept", "*/*");

conn.setRequestProperty("Charset", "UTF-8");

conn.connect(); //連接,所有的配置必須要在connect之前完成

OutputStream outStrm = conn.getOutputStream(); //此處getOutputStream會(huì)隱含的進(jìn)行connect(即:如同調(diào)用上面的connect()方法踱蠢,所以在開發(fā)中不調(diào)用上述的connect()也可以)火欧。

ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm); //現(xiàn)在通過輸出流對(duì)象構(gòu)建對(duì)象輸出流對(duì)象,以實(shí)現(xiàn)輸出可序列化的對(duì)象茎截。

objOutputStrm.writeObject(new String("我是測(cè)試數(shù)據(jù)")); //向?qū)ο筝敵隽鲗懗鰯?shù)據(jù)苇侵,這些數(shù)據(jù)將存到內(nèi)存緩沖區(qū)中

objOutputStm.flush(); //刷新對(duì)象輸出流

objOutputStm.close(); //關(guān)閉流對(duì)象。此時(shí)企锌,不能再向?qū)ο筝敵隽鲗懭肴魏螖?shù)據(jù)榆浓,先前寫入的數(shù)據(jù)存在于內(nèi)存緩沖區(qū)中,在調(diào)用下邊的getInputStream()函數(shù)時(shí)才把準(zhǔn)備好的http請(qǐng)求正式發(fā)送到服務(wù)器

int responseCode = conn.getResponseCode();

if (responseCode == HttpURLConnection.HTTP_OK) {

//調(diào)用conn連接對(duì)象的getInputStream()函數(shù), 將內(nèi)存緩沖區(qū)中封裝好的完整的HTTP請(qǐng)求電文發(fā)送到服務(wù)端。

content = convertStream2String(conn.getInputStream()); //getInputStream()方法已調(diào)用,本次HTTP請(qǐng)求已結(jié)束,下邊向?qū)ο筝敵隽鞯妮敵鲆褵o意義撕攒,因此陡鹃,要重新發(fā)送數(shù)據(jù)時(shí)需要重新創(chuàng)建連接、重新設(shè)參數(shù)抖坪、重新創(chuàng)建流對(duì)象萍鲸、重新寫數(shù)據(jù)

} else {

content = "";

}

} catch (Exception e) {

} finally {

if (conn != null) {

conn.disconnect();

conn = null;

}

}

}

return content;

}

總的來說??

也就是servlet相當(dāng)于服務(wù)端,是用于接收請(qǐng)求發(fā)送響應(yīng)擦俐,也就是說當(dāng)用Java寫一個(gè)HTTP發(fā)送以及接收響應(yīng)完整的過程時(shí)脊阴,首先我們應(yīng)該創(chuàng)建我們服務(wù)的servlet,開啟servlet后,創(chuàng)建請(qǐng)求嘿期,發(fā)送請(qǐng)求品擎,接收響應(yīng)。我們平常所用的Tomcat就相當(dāng)于一個(gè)servlet备徐。


很多細(xì)節(jié)都沒寫萄传,后面慢慢完善吧!可能會(huì)有我理解不正確的地方蜜猾,歡迎指正盲再。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市瓣铣,隨后出現(xiàn)的幾起案子答朋,更是在濱河造成了極大的恐慌,老刑警劉巖棠笑,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梦碗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蓖救,警方通過查閱死者的電腦和手機(jī)洪规,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來循捺,“玉大人斩例,你說我怎么就攤上這事〈娱伲” “怎么了念赶?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)恰力。 經(jīng)常有香客問我叉谜,道長(zhǎng),這世上最難降的妖魔是什么踩萎? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任停局,我火速辦了婚禮,結(jié)果婚禮上香府,老公的妹妹穿的比我還像新娘董栽。我一直安慰自己,他們只是感情好企孩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布锭碳。 她就那樣靜靜地躺著,像睡著了一般柠硕。 火紅的嫁衣襯著肌膚如雪工禾。 梳的紋絲不亂的頭發(fā)上运提,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天蝗柔,我揣著相機(jī)與錄音闻葵,去河邊找鬼。 笑死癣丧,一個(gè)胖子當(dāng)著我的面吹牛槽畔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播胁编,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼厢钧,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了嬉橙?” 一聲冷哼從身側(cè)響起早直,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎市框,沒想到半個(gè)月后霞扬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枫振,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年喻圃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粪滤。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡斧拍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出杖小,到底是詐尸還是另有隱情肆汹,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布予权,位于F島的核電站县踢,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏伟件。R本人自食惡果不足惜硼啤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望斧账。 院中可真熱鬧谴返,春花似錦、人聲如沸咧织。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽习绢。三九已至渠抹,卻和暖如春蝙昙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背梧却。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工奇颠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人放航。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓烈拒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親广鳍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子荆几,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 經(jīng)驗(yàn):1.在網(wǎng)絡(luò)端接收數(shù)據(jù)后寫入本地時(shí)要用write(byte[],0,len),不要用write(byte[])...
    123yuan123閱讀 379評(píng)論 0 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)赊时,斷路器吨铸,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • 湛藍(lán)的天空中飄著大團(tuán)大團(tuán)的云 聚了又散 一整夜淅淅瀝瀝的梅雨之后 又是一個(gè)晴天 清晨的陽光灑在爬山虎密布的墻壁上 ...
    步寧凝閱讀 274評(píng)論 3 7
  • 《望江南·初秋》 鐘聲晚,眾芳欲語遲祖秒。寒蟬處處夕陽血诞吱,殘琴錚錚紅上煙。同送子規(guī)聲狈涮。 《望江南·中秋》 登霄漢狐胎,長(zhǎng)歌...
    生活戀情閱讀 382評(píng)論 1 0
  • Can't locate API module structure `php5_module' http://wi...
    寧靜世界閱讀 885評(píng)論 0 0