java发送http请求

项目中需要使用java发送restful请求,主要包括post和get。

  • HTTP和REST的关系

HTTP是超文本传输协议,是应用层的协议,一般使用在TCP协议之上,具有请求行(返回:状态行)、报文头和报文正文组成,有以下几个特点:1. 支持客户/服务器模式 2.简单访问,只需要请求方式和路径。3. 灵活允许任何格式的对象 4. 无连接 5. 无状态。

REST是表征状态转移,是一种支持HTTP协议的框架约束条件和原则,满足REST约束条件和原则的设计和实现方式就是RESTful。RREST有以下几个特点:1. 所有的资源都有ID标识。 2. 所有的资源都有互联性 3. 使用标准的方法 4.多种表现形式 5. 无状态

一个Http请求包括三个重要的部分:

  Method-URI-Protocol/Version

  Request headers

  Entity body

  下面是一个Http请求的例子:

  POST /servlet/default.jsp HTTP/1.1

  Accept: text/plain; text/html

  Accept-Language: en-gb

  Connection: Keep-Alive

  Host: localhost

  Referer: http://localhost/ch8/SendDetails.htm

  User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)

  Content-Length: 33

  Content-Type: application/x-www-form-urlencoded

  Accept-Encoding: gzip, deflate

  LastName=Franks&FirstName=Michael

HTTP响应和请求非常相似,同样包括三个部分:

  Protocol-Status code-Description

  Response headers

  Entity body

  下面是一个具体的例子:

  HTTP/1.1 200 OK

  Server: Microsoft-IIS/4.0

  Date: Mon, 3 Jan 1998 13:13:33 GMT

  Content-Type: text/html

  Last-Modified: Mon, 11 Jan 1998 13:23:42 GMT

  Content-Length: 112

  something in html style......................

  • REST和RESTful的区别?

REST(Representational State Transfer)是表征状态转移,是一种基于HTTP协议的框架条件约束和原则,而RESTful是基于REST设计和实现的框架。

  • get和post的区别

http的访问方式有主要有GET,POST,PUT,DELETE四种,它们分别对应于查、改、增、删。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。get请求一般是安全和幂等的。安全是因为get是查询操作,不会修改数据,所以安全;幂等是对同样的url多次请求,返回同样的结果。但是目前许多开发人员在使用这四个操作的时候,并没有严格按照各自的去操作。

1)get发送方式是将实体与url拼接,放在报文头部的,而post是放在报文正文的部分。

2)get发送的数据量小,一般小于1024K,post发送的大,理论上无限制。[url其实也没有对长度做出限制,get的限制是因为浏览器和服务器对url做出了限制,post实际时根据服务器的处理程序的处理能力限制,一般存在80K/100K的大小限制]

3)post比get更加的安全。这里的安全和上面的不一样,这里的安全是因为get会将数据显示在url中,会暴露数据信息,post就不会。

  • 实现方式

  <-----使用代理的方式------->

1.get

1)实例化一个url,使用openConnection的方法打开url链接。 //将内容与url拼接,使用url的openConnection返回一个UrlConnection

2)设置访问的属性值(报文头)。

3)使用实例的方法getInputStream,可以获得返回的数据流,定义BufferedReader输入流来读取URL的响应就可以获得返回的数据

2.post

1)实例化一个URL类,然后使用openConnection的方法打开url链接。

2)设置访问的属性值(报文头,注意打开OutPut)。

3)将conn的outputstream封装到一个printwriter类的out实例中,然后使用out实例的flush()方法输出流的缓冲。//将内容放到报文正文中

4)使用实例的方法getInputStream,可以获得返回的数据流,定义BufferedReader输入流来读取URL的响应就可以获得返回的数据。

import java.io.*;
import java.net.*;
import java.util.*;

public class HttpTest{
        public static void main(String [] args){
                HttpTest ht = new HttpTest();
                String url = "http://10.104.5.241:8080/IoTApp/URTFMS/road/nodes/11010802020000000001";
                String param="";
                String head1 = "Content-Type";
                String head2 = "application/json";
                //ht.httpConn(url,param,head1,head2);
                ht.doPost(url,param,head1,head2);
        
        }
        
        //get方式:参数放置在url上
        public void httpConn(String url1, String param , String head1, String head2){
                String urlNameString = url1 + "?" + param;  
                try{
                        URL url = new URL(url1);
                        //打开url的连接
                        URLConnection conn = url.openConnection();
                        //设置连接属性
                        conn.setConnectTimeout(6*1000);
                        //获得输入流,并封装为字符
                        BufferedReader in = new BufferedReader(
                                        new InputStreamReader(conn.getInputStream()));//获得网络返回的输入流
                        String line;
                        String result=null;
                        while ((line = in.readLine()) != null) {
                                result += "/n" + line;
                        }
                        result=new String(result.getBytes(),"UTF-8");
                        System.out.println("result"+result);
                }catch(Exception e){
                        e.printStackTrace();
                }
                finally{
                
                }
        }
        
        //post方式,以输出流的形式发送
        public void doPost(String url1, String param , String head1, String head2){
                try{
                        URL url = new URL(url1);
                        //打开url的连接
                        URLConnection conn = url.openConnection();      
                        //设置url的连接属性
                        conn.setConnectTimeout(6*1000);                 
                        conn.setDoOutput(true);    //设置OutPut是Ture
                        //获得输出流,并将其封装为字符流
            PrintWriter out = new PrintWriter(conn.getOutputStream());
            //按字节的方式打印输出字符,并写入数组的某一部分
            out.print(param);
            //刷新输出流的缓冲
            out.flush();
                        //获得网络返回的输入流,并封装为输入流
                        BufferedReader in = new BufferedReader(
                                        new InputStreamReader(conn.getInputStream()));
                        String line;
                        String result=null;
                        while ((line = in.readLine()) != null) {
                                result += "/n" + line;
                        }
                        result=new String(result.getBytes(),"UTF-8");
                        System.out.println("result"+result);
                }catch(Exception e){
                        e.printStackTrace();
                }
                finally{
                
                }
        }
}

备注:

URL realUrl = new URL(url_s);
Class<?> clazz=realUrl.openConnection().getClass();
System.out.println(clazz);  //这个类不是java.net包下的UrlConnection,是sun公司后期包装的UrlConnection//sun.net.www.protocol.http.HttpURLConnection

Class<?> superClazz=clazz.getSuperclass();
System.out.println(superClazz);  //class java.net.HttpURLConnection