美文网首页Java 杂谈程序员
关于http协议------HttpServlet、HttpCl

关于http协议------HttpServlet、HttpCl

作者: 是我呀是我呀是我呀 | 来源:发表于2018-08-16 10:58 被阅读11次

记录一次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。

很多细节都没写,后面慢慢完善吧!可能会有我理解不正确的地方,欢迎指正。

相关文章

  • 关于http协议------HttpServlet、HttpCl

    记录一次HTTP相关内容的学习 关于HttpServlet 在大多数的Web应用程序中,客户端都是通过Http协议...

  • Java 后台基础学习大纲

    一、Servlet 熟悉 HTTP 协议,HTTPS 协议 熟悉 Servlet 规范,HttpServlet 如...

  • SpringBoot | 整体架构分析

    核心要点:1、SpringBoot整体架构2、Servlet标准3、HttpServlet标准4、Http协议请求...

  • android 网络通信(一)

    在android 开发中使用http 协议来与后台交互是一种常见的操作,在android 中主要通过 HttpCl...

  • servlet

    java的用于提供服务的接口,可以用它实现自定义的协议,通常用于http协议,httpservlet.当客户端发送...

  • "javax.servlet.---------->http.H

    - The superclass "javax.servlet.http.HttpServlet" was not...

  • HTTP/1.1协议知识小结

    1.关于HTTP协议 ​ HTTP协议(HyperText Transfer Protocol)及超...

  • 关于HTTP协议

    关于HTTP协议 HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输...

  • 关于http协议

    HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写; H...

  • 关于 HTTP 协议

    HTTP 协议广泛用在客户端浏览器和服务器之间进行传输数据。它是一种基于 TCP 连接的一个无状态的应用层协议。H...

网友评论

    本文标题:关于http协议------HttpServlet、HttpCl

    本文链接:https://www.haomeiwen.com/subject/awynbftx.html