美文网首页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

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