模拟浏览器向服务器发送和接收数据

创建一个服务器程序,用来接收和返回数据:

public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    System.out.println(request.getMethod());                //获取请求方式
    System.out.println(request.getHeader("referer"));       //获取请求页面
    System.out.println(request.getParameter("name"));       //获取参数
    response.getOutputStream().write("Hello".getBytes());   //向浏览器回送数据
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    doGet(request, response);
}

接下来,再创建一个Java程序向这个服务器程序发送请求,类 HttpURLConnection提供方法获取和发送请求数据.但是构造方法

    protected HttpURLConnection(URL u)

表明我们不能直接创建这个对象,也没有任何静态方法能够返回这个对象.于是我们需要绕一把..先获得 URL对象,再利用openConnection()返回HttpURLConnection对象:

public void sendHttp() throws IOException{  
    URL url = new URL("http://localhost:8080/ImitateRequest/servlet/servlet");    //设置要访问的链接  
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();            //获取HttpURLConnection的对象  
      
    conn.setDoOutput(true);                      //默认值为false,不能传递参数  
    conn.setRequestMethod("POST");                                                //设置请求方式  
    conn.setRequestProperty("referer", "http://www.sina.com/index.html");  
    OutputStream out = conn.getOutputStream();  
    out.write("name=aaaa".getBytes());           //向服务器发送一个值为"aaaa"的name参数,如果conn的DoOutput属性值为false,此处将抛出异常  
      
    conn.getResponseCode();                      //获取响应状态码  
}  

以上是发送一次请求需要掌握的方法,接下来是读取一次请求:

public void readHttp() throws IOException{
        URL url = new URL("http://localhost:8080/ImitateRequest/servlet/servlet");    //设置请求的链接
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        
        System.out.println(conn.getResponseCode());                      //查看响应状态码
        System.out.println(conn.getHeaderField("Content-Length"));       //响应文本内容的长度
        InputStream in = conn.getInputStream();                          //获取一个和服务器返回的内容相关联的流
        try{
            int len = 0;
            byte[] buffer = new byte[1024];
            while((len = in.read(buffer))>0){
                System.out.println(new String(buffer,0,len));    //输出到控制台
            }
        }finally{
            if(in!=null)
                try{
                    in.close();
                }catch(Exception e){
                }
        }
    } 

常用的一些HTTP协议请求头:

Request

GET /h.gif?pid=113&monkey=cool HTTP/1.1

请求方式  请求路径  请求版本

Accept

image/png, image/svg+xml, image/*;q=0.8, */*;q=0.5

浏览器可接收的类型

Referer

http://hao123.com/

来源路径

Accept-Language

zh-CN

浏览器可以接收的语言

User-Agent

Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)

浏览器的厂商信息

Content-Type

text/html; charset=UTF-8

数据的内容类型

Accept-Encoding

gzip, deflate

浏览器可以接收压缩后的数据

Host

nsclick.baidu.com

请求的主机IP和端口号

Content-Length

289

用于指定数据的总长度

Connection

Keep-Alive

维持一个活动连接

Cache-Control

no-cache

缓存情况

Cookie

BAIDUID=304614CF0781D6FABA00280E60983AF5:FG=1

COOKIE

上一篇:Spring学习笔记


下一篇:彻底解决全站乱码