Http协议是一种浏览器的协议

 

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

 

 

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

 

 

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

 

 

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

 

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")
"User-Agent", ApiURL.USER_AGENT)
"Referer",  url.getReferer())
"Origin",  url.getOrigin())
"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=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协议的报文,并将报文回传给浏览器,浏览器最后解析这个响应报文,将最终结果展示给用户。

用户发起请求到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。