项目中需要使用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