• 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
    

      

  • 相关阅读:
    阿里云SLB的http强制转https
    nginx反向代理springboot的jar包
    阿里云Centos7上添加swap分区
    AWS云怎么删除信用卡账户
    Linux记录别人操作
    Jumpserver里常用的sudo权限
    端口一览表
    网络端口及其详解
    阿里云安全防坑指南
    LINUX添加只读用户(查日志专用)
  • 原文地址:https://www.cnblogs.com/lxq0309/p/3641088.html
Copyright © 2020-2023  润新知