<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    badqiu

    XPer
    隨筆 - 46, 文章 - 3, 評論 - 195, 引用 - 0
    數據加載中……

    spring REST中的內容協商(同一資源,多種展現:xml,json,html)

    接上一篇對spring rest的描述.


    一.REST內容協商介紹 

    RESTful服務中很重要的一個特性即是同一資源,多種表述.也即如下面描述的三種方式:

    1.使用http request header: Accept
    GET /user/123 HTTP/1.1
    Accept: application/xml                 //將返回xml格式數據

    GET /user/123 HTTP/1.1
    Accept: application/json               //將返回json格式數據
    2.使用擴展名
    /user/123.xml  將返回xml格式數據
    /user/123.json 將返回json格式數據
    /user/123.html 將返回html格式數據
    3.使用參數
    /user/123?format=xml          //將返回xml數據
    /user/123?format=json          //將返回json數據

    而以上三種各有優缺點:
    1.使用Accept header:
       這一種為教科書中通常描述的一種,理想中這種方式也是最好的,但如果你的資源要給用戶直接通過瀏覽器訪問(即html展現),那么由于瀏覽器的差異,發送上來的Accept Header頭將是不一樣的. 將導致服務器不知要返回什么格式的數據給你. 下面是瀏覽器的Accept Header
    chrome:   
    Accept:application/xml,application/xhtml+xml,textml;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5   
      
    firefox:   
    Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8   
      
    IE8:   
    Accept:image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */* 


    2.使用擴展名
      喪失了同一url多種展現的方式,但現在這種在實際環境中是使用最多的.因為更加符合程序員的審美觀.

    3.使用參數
      可能由于要編寫的字符較多,所以較少使用.

    帶著上面的選擇: 使用擴展名,我們來看一下spring中如何配置這部分.



    二.spring rest配置

    現spring完成內容協商(content negotiation)的工作是由ContentNegotiatingViewResolver來完成的.它的工作模式支持我上面講的三種,
    ContentNegotiatingViewResolver是根據客戶提交的MimeType(如 text/html,application/xml)來跟服務端的一組viewResover的MimeType相比較,如果符合,即返回viewResover的數據.
    而 /user/123.xml, ContentNegotiatingViewResolver會首先將 .xml 根據mediaTypes屬性將其轉換成 application/xml,然后完成前面所說的比較.


    下面是ContentNegotiatingViewResolver的完全配置.



        
    <!-- 根據客戶端的不同的請求決定不同的view進行響應, 如 /blog/1.json /blog/1.xml -->
        
    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
                    
    <!-- 設置為true以忽略對Accept Header的支持-->
                    
    <property name="ignoreAcceptHeader" value="true"/>
                    
    <!-- 在沒有擴展名時即: "/user/1" 時的默認展現形式 -->
            
    <property name="defaultContentType" value="text/html"/>
            
                    
    <!-- 擴展名至mimeType的映射,即 /user.json => application/json -->
            
    <property name="mediaTypes">
                
    <map>
                    
    <entry key="json" value="application/json" />
                    
    <entry key="xml" value="application/xml" />
                
    </map>
            
    </property>
            
    <!-- 用于開啟 /userinfo/123?format=json 的支持 -->
            
    <property name="favorParameter" value="false"/>
            
    <property name="viewResolvers">
                
    <list>
                    
    <bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />
                    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                        
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
                        
    <property name="prefix" value="/pages"/>
                        
    <property name="suffix" value=".jsp"></property>
                    
    </bean>
                
    </list>
            
    </property>
            
    <property name="defaultViews">
                
    <list>
                    
    <!-- for application/json -->
                    
    <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
                    
    <!-- for application/xml -->
                    
    <!-- 
                    <bean class="org.springframework.web.servlet.view.xml.MarshallingView" >
                        <property name="marshaller">
                            <bean class="org.springframework.oxm.xstream.XStreamMarshaller"/>
                        </property>
                    </bean>
                     
    -->
                
    </list>
            
    </property>
        
    </bean>

    查看demo:  http://demo.rapid-framework.org.cn:8080/springmvc_rest_demo/userinfo
    demo下載:  http://rapid-framework.googlecode.com/files/springmvc_rest_demo.zip

    posted on 2009-12-21 14:36 badqiu 閱讀(7619) 評論(2)  編輯  收藏

    評論

    # re: spring REST中的內容協商(同一資源,多種展現:xml,json,html)  回復  更多評論   

    看起來樓主是下過苦功夫的啊。呵呵
    2009-12-21 16:02 | 新奇特創意產品

    # re: spring REST中的內容協商(同一資源,多種展現:xml,json,html)  回復  更多評論   


    不錯,正是我要尋找的..

    2011-03-21 12:43 | HideHai

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 色播在线永久免费视频网站| 亚洲AV噜噜一区二区三区 | 在线精品一卡乱码免费| 一个人免费观看视频在线中文| 午夜免费福利在线观看| 亚洲一久久久久久久久| 国产免费伦精品一区二区三区| 伊在人亚洲香蕉精品区麻豆| 精品免费AV一区二区三区| 免费一级毛片一级毛片aa| 阿v免费在线观看| 国产成人精品亚洲精品| 久久久久久毛片免费看| 亚洲成a人片在线观看无码专区| 男人j进入女人j内部免费网站| 久久精品国产精品亚洲毛片| 亚洲精品视频免费| 亚洲精品国产精品乱码不卡√| 久久国产精品免费观看| 亚洲国产精品成人综合久久久 | 亚洲av无码成人精品国产| 免费播放春色aⅴ视频| 国产精品无码永久免费888| 国产aⅴ无码专区亚洲av| 精品香蕉在线观看免费| 亚洲国产精品久久久久秋霞小| 亚洲视频在线免费| 小日子的在线观看免费| 日韩亚洲产在线观看| 6080午夜一级毛片免费看6080夜福利 | 亚洲自偷自偷在线成人网站传媒| 国产高清免费在线| 中文字幕视频免费在线观看| 亚洲熟妇无码爱v在线观看| 精品久久免费视频| 免费国产午夜高清在线视频| 国产亚洲国产bv网站在线| 亚洲熟伦熟女新五十路熟妇 | 亚洲一区二区三区在线播放| 国产精品99久久免费观看| 亚洲日韩国产精品乱-久|