記錄一次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ì)有我理解不正確的地方蜜猾,歡迎指正盲再。