<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

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


    網站導航:
     
    主站蜘蛛池模板: 免费观看黄色的网站| 中文字幕无线码免费人妻| 我要看免费的毛片| 亚洲视频免费在线看| 99精品在线免费观看| 亚洲AV一宅男色影视| 无码精品人妻一区二区三区免费看 | 一本久久a久久精品亚洲| 美女被免费网站在线视频免费| 亚洲国产区男人本色| 99久久99这里只有免费费精品| 九九九精品成人免费视频| 亚洲一区免费视频| 免费国产黄线在线观看| 亚洲AV日韩AV无码污污网站| 国产精品久久香蕉免费播放| 有色视频在线观看免费高清在线直播| 国产免费一区二区三区免费视频 | 在线观看成人免费视频不卡| 亚洲系列中文字幕| 免费无码黄十八禁网站在线观看| 亚洲午夜精品第一区二区8050| 亚洲视频在线免费播放| 2019中文字幕免费电影在线播放| 国产高清免费观看| 亚洲国产成人无码AV在线影院| 最近免费mv在线电影| 久久亚洲AV无码精品色午夜| 在线永久看片免费的视频| 亚洲成av人在线观看网站| 亚洲综合最新无码专区| 国产激情免费视频在线观看| 亚洲欧洲日产v特级毛片| 四虎永久免费地址在线观看| 在线观看人成视频免费无遮挡| 热99re久久免费视精品频软件| 亚洲精品线在线观看| 午夜视频免费成人| 免费在线黄色电影| 亚洲爆乳少妇无码激情| 亚洲国产成人一区二区三区|