记录一次HTTP相关内容的学习
关于HttpServlet
在大多数的Web应用程序中,客户端都是通过Http协议去访问服务器端的资源,而我们编写的Servlet主要是用于Http协议的请求和响应处理。为了快速开发应用于Http协议的Servlet类,Sun公司在javax.servlet.http包中提供了一个抽象类HttpServlet,它继承于GenericServlet,用于创建适合基于Http协议的Web Servlet。创建一个HTTPservlet必须继承HttpServlet类,并且重写里面的doGet,doPost方法。。。。
创建一个servlet用于处理请求
public class ThreeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("这是GET方式发送的请求,Servlet使用doGet()方法来处理.");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("这是POST方式发送的请求,Servlet使用doPost()方法来处理.");
}
}
HttpClient和HttpURLConnection
简单来说,HttpClient就是一个增强版的HttpURLConnection,HttpURLConnection可以做的事情HttpClient全部可以做;HttpURLConnection没有提供的有些功能,HttpClient也提供了,但它只是关注于如何发送请求、接收响应,以及管理HTTP连接。
使用HttpClient发送请求、接收响应很简单,只要如下几步即可:
1.创建HttpClient对象。
2.如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
3.如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
4.调用HttpClient对象的execute(HttpUriRequest request)发送请求,执行该方法返回一个HttpResponse。
5.调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
public classHttpClientTest{
publicString doPost(String url, String params) {
CloseableHttpClient httpClient = HttpClients.createDefault();//创建Httpclient对象
HttpPost httpPost =newHttpPost(url);//创建HttpPost对象
httpPost.setHeader("Accept","application/xml");
httpPost.setHeader("Content-Type","application/xml");
String charSet ="UTF-8";
StringEntity entity =newStringEntity(params, charSet);
httpPost.setEntity(entity);//使用setEntity方法来设置请求参数
CloseableHttpResponse response =null;
try{
response = httpClient.execute(httpPost);//调用httpclient对象的execute发送请求,执行方法返回一个httpresponse
StatusLine status = response.getStatusLine();
intstate = status.getStatusCode();
if(state == HttpStatus.SC_OK) {
HttpEntity responseEntity = response.getEntity();//调用httpResponse的getEntity方法可获得httpEntity对象,程序可通过该对象获取服务器的响应内容
String xmlString = EntityUtils.toString(responseEntity);
returnxmlString;
}else{
System.out.println("请求返回:"+ 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("请求:");
System.out.println(" "+params);
System.out.println("响应:");
System.out.println(" "+result);
}
}
使用HttpURLConnection发送HTTP请求
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); //设置是否向conn输出,因为这个是post请求,参数要放在http正文内,因此需要设为true, 默认情况下是false
conn.setDoInput(true); //设置是否从conn读入,默认情况下是true
conn.setUseCaches(false); //Post请求不能使用缓存
conn.setRequestMethod("POST"); // 设定请求的方法为"POST",默认是GET
conn.setConnectTimeout(6*1000); //设置连接主机超时
conn.setReadTimeout(6*1000); //设置从主机读取数据超时
conn.setRequestProperty("Content-type", "application/x-java-serialized-object"); //设定传送的内容类型是可序列化的java对象,(如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException)
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("Charset", "UTF-8");
conn.connect(); //连接,所有的配置必须要在connect之前完成
OutputStream outStrm = conn.getOutputStream(); //此处getOutputStream会隐含的进行connect(即:如同调用上面的connect()方法,所以在开发中不调用上述的connect()也可以)。
ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm); //现在通过输出流对象构建对象输出流对象,以实现输出可序列化的对象。
objOutputStrm.writeObject(new String("我是测试数据")); //向对象输出流写出数据,这些数据将存到内存缓冲区中
objOutputStm.flush(); //刷新对象输出流
objOutputStm.close(); //关闭流对象。此时,不能再向对象输出流写入任何数据,先前写入的数据存在于内存缓冲区中,在调用下边的getInputStream()函数时才把准备好的http请求正式发送到服务器
int responseCode = conn.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
//调用conn连接对象的getInputStream()函数, 将内存缓冲区中封装好的完整的HTTP请求电文发送到服务端。
content = convertStream2String(conn.getInputStream()); //getInputStream()方法已调用,本次HTTP请求已结束,下边向对象输出流的输出已无意义,因此,要重新发送数据时需要重新创建连接、重新设参数、重新创建流对象、重新写数据
} else {
content = "";
}
} catch (Exception e) {
} finally {
if (conn != null) {
conn.disconnect();
conn = null;
}
}
}
return content;
}
总的来说
也就是servlet相当于服务端,是用于接收请求发送响应,也就是说当用Java写一个HTTP发送以及接收响应完整的过程时,首先我们应该创建我们服务的servlet,开启servlet后,创建请求,发送请求,接收响应。我们平常所用的Tomcat就相当于一个servlet。
很多细节都没写,后面慢慢完善吧!可能会有我理解不正确的地方,欢迎指正。
网友评论