您的位置:首页 > 理论基础 > 计算机网络

HTTP协议在java中的运用

2016-08-06 18:57 197 查看
Http协议是一种浏览器的协议

 

HTTP是一个客户端服务器端请求和应答的标准(TCP)。客户端是终端用户,服务器端是网站。

 

 

是一种客户端发起请求服务器端响应的一个过程。

 

 

以java程序为例:java通过客户端html页面
以及ajax向tomcat服务器也就是一个发布的网站。此时客户端发起的请求,就会到达服务器端,服务器端接收到数据就会响应到客户端。进行消息的传递。

 

 

今天我开始github项目的学习了解到了另外一种方式:apach的httpclient以及其他人编写的开源http请求工具;

 

 JSONObject r = new JSONObject();

       r.put("username",
"jack");

       r.put("password",
"123");  

    

       //1发送请求::

      

 

 Response<String> response = post(ApiURL.GET_GROUP_LIST,
r);

 

 

//2:向其他应用程序发起请求:http://www.taotao.com/index.html并且发送的json数据

 

 

 return Requests.post("http://www.taotao.com/index.html")

             .addHeader("User-Agent", ApiURL.USER_AGENT)

             .addHeader("Referer",
url.getReferer())

             .addHeader("Origin",
url.getOrigin())

             .addForm("r",
r.toJSONString())

             .text();

 

//3:请求到达我的:服务器端spring mvc的controller进行处理:

 

@RequestMapping(method=RequestMethod.POST)

public ModelAndView toIndex(HttpServletRequest
request,HttpServletResponse
response){

//既然他已经将值在java程序中像浏览器那样把数据放到了表单中发送给了我,这个时候我就可以接受

//到参数进而返回给他:

System.out.println("我从其他程序中获取到的http协议中的值"+request.getParameter("username"));

System.out.println("我从其他程序中获取到的http协议中的值"+request.getParameter("password"));

        //由于前台是用json格式发送的数据所以我后台接受不到了需要利用新致的架构获取json类型的数据

    Map<String,Object>  map=getRequestMap(request);

System.out.println("通过另外一种方式获取json数据:用户名"+map.get("username"));

System.out.println("通过另外一种方式获取json数据:密码"+map.get("password"));

 

ModelAndView mv=new ModelAndView("index");

 

这就是关于不同系统之间的调用:一个发起请求一个接收请求::http请求:

 

 

 

例如最新的webservice是基于soap协议的不是基于http协议的,当然一种新的技术产生首先分析他采用的是什么协议,然后这种协议如何发送以及接收数据,数据是怎么传递的。

 

 

目前比较迷惑的一点是:为什么tomcat发布的java程序可以当做服务器:servlet
struts2 spring mvc框架为什么能接收到http请求。估计看完tomcat原理以及框架原理就明白了。

 

一切的httpclient
以及其他框架的请求都是在模拟浏览器作为客户端在请求。

 

Servlet的作用是接收浏览器传给服务端的请求(request),并将服务端处理完的响应(response)返回给用户的浏览器,浏览器和服务端之间通过http协议进行沟通

 

 

 

 

 

 

基于http协议传输数据到服务器一般都是首先先:拼接http请求报文:

 

GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1  

Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint,

application/msword, application/x-silverlight, application/x-shockwave-flash, */*  

Referer: <a
href="http://www.google.cn/">http://www.google.cn/</a>  

Accept-Language: zh-cn  

Accept-Encoding: gzip, deflate  

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)  

Host: <a
href="http://www.google.cn">www.google.cn</a>  

Connection: Keep-Alive  

Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g;

NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-

FxlRugatx63JLv7CWMD6UB_O_r  

 

 

 

 

2:用户通过浏览过程是浏览器根据用户的选择将相关信息按http协议报文的规范组装请求的http报文,报文通过网络传输到指定的服务器,服务器通过特定的web容器接收这个报文信息,例如:tomcat,jetty,jboss这样的web容器,web容器会将http报文解析出来,如果是用户请求,最终解析出来的报文信息会用一个request对象存储起来,服务端使用这个request做完相应的处理后,服务端程序将结果信息封装到response对象里,然后将response对象交给web容器,web容器则把这个response对象转变为http协议的报文,并将报文回传给浏览器,浏览器最后解析这个响应报文,将最终结果展示给用户。

 

  3 用户发起请求到80端口的tomcat容器======tomcat容器将浏览器的报文头解析放入到request中,将相应处理后的信息放入到response中。但是最为开发者你改如何使用容器接收到的数据,以及拿到服务器tomcat相应的数据呢??、

 

  

 第四步4:

Web容器创造了servlet接口,servlet接口就是开发人员自己实现业务逻辑的地方,程序员开发servlet就好比做填空题,而填空题的语境或者说上下文提示就是由request和response对象,但是javaEE规范里的servlet接口很简单,就三个方法init,service和destory,但是这个接口太笼统,所以规范里还提供了一个HttpServlet类,这个类根据http请求类型提供了doGet,doPost等方法,servlet接口最大的特点就是根据http协议的特点进行定义,因此做servlet开发时候如果使用者对http协议特点不是特别熟悉,都会碰到或多或少令人迷惑的问题,特别是碰到一些复杂特殊的请求时候:例如文件上传,返回特殊的文件格式到浏览器,这时候使用servlet开发就不是很方便了,servlet开发还有个问题可能大家常常被忽视,就是请求的数据的类型转化,http协议传输都是文本形式,到了web容器解析后也是文本类型,如果碰到货币,数字,日期这样的类型需要我们根据实际情况进行转化,如果页面传送的信息非常多,我们就不得不做大量类型转化,这种工作没有什么技术含量,是个体力活而且很容易导致程序错误。同时java的企业开发都是围绕javabean进行,类型转化好的数据还要封装到对应的javabean里,这种转来转去的事情对于项目开发绝对不是什么好事情,所以古老的struts1为这种问题找到了一种解决方案,就是定义了一个DTO对象(数据传输对象),专门负责做这样的事情,不过到了struts2,整个替代servlet的action本身就是一个javabean。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: