<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 閱讀(7626) 評論(2)  編輯  收藏

    評論

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

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

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


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

    2011-03-21 12:43 | HideHai

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


    網站導航:
     
    主站蜘蛛池模板: 一级做a爰全过程免费视频| 豆国产96在线|亚洲| 最近的2019免费中文字幕| 免费A级毛片无码久久版| 亚洲熟妇无码八V在线播放| 4399好看日本在线电影免费| 亚洲精品无码专区在线在线播放 | 成全动漫视频在线观看免费高清版下载| 成人亚洲网站www在线观看| 国产成人亚洲综合在线| 五月天婷亚洲天综合网精品偷| 无遮挡呻吟娇喘视频免费播放| 国产成人一区二区三区免费视频 | 国产精品无码永久免费888| 精品国产日韩亚洲一区| 特级做A爰片毛片免费看无码| 亚洲国产精品无码专区| 91久久青青草原线免费| 亚洲色精品VR一区区三区| 国产成人精品免费视频软件| 免费精品国自产拍在线播放| 国产精品V亚洲精品V日韩精品| 国产在线精品一区免费香蕉| 亚洲视频免费观看| 好男人www免费高清视频在线| 亚洲男女一区二区三区| a毛片在线看片免费| 亚洲成人动漫在线观看| 久久久久免费看黄A片APP| 亚洲va中文字幕| 亚洲午夜精品第一区二区8050| 国产日韩一区二区三免费高清| 亚洲国产精久久久久久久| 青青青免费国产在线视频小草| 亚洲av无码专区在线观看下载| 亚洲第一页日韩专区| 日本免费大黄在线观看| 亚洲熟妇无码一区二区三区| 亚洲中文字幕无码爆乳AV| 桃子视频在线观看高清免费完整| 午夜亚洲国产精品福利|