欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于JAVA中Jersey處理Http協(xié)議中的Multipart的詳解

 更新時間:2013年05月08日 19:01:41   作者:  
之前在基于C#開發(fā)彩信用最原始的StringBuilder拼接字符串方式處理過Multipart。現(xiàn)在在做一個項目的時候,由于之前的技術(shù)路線都是使用Jersey處理Http這塊,為了保持技術(shù)路線一致,研究了一下如何使用Jersey處理Http協(xié)議中的Multipart

     那么Http協(xié)議中的Multipart是個什么東東?下面是摘抄h(huán)ttp協(xié)議1.1的一段話:
在multipart entity(多部分實體)的例子中,一個或多個不同的數(shù)據(jù)集合并在一個單一的body(體)中,一個"multipart"(多部分)類型 field的(域)必須出現(xiàn)在實體的header(頭域)。body(體)必須包括一個或多個body part(體部分),每一個位于boundary(邊界)定界符線之前,最后一個則跟著一個結(jié)束邊界定界符線。在它的邊界定界符線后,每一個體部分由頭域、空行、體組成。
     上面的描述寫的有點拗口,簡單的理解可以為:一個post的請求,可以根據(jù)一定規(guī)范去定義多個部分;

     下面用移動網(wǎng)狀網(wǎng)協(xié)議(其實就是一個請求中包括2個獨立的xml內(nèi)容,一個head的xml,一個body的xml)去舉例說明如何利用Jersey處理Multipart,主要代碼如下(開始的時候server端接收的代碼死活不知道如何寫也沒查到別人怎么寫的,后來一生氣,反編譯jersey-multipart-1.0.3.1.jar包的代碼看了下,才明白):

復(fù)制代碼 代碼如下:

private static WebResource webResource = client.resource("http://xxx.xx.xx:xxx");

public static final String HeadFieldName = "xmlhead";
public static final String BodyFieldName = "xmlbody";

 
// Client發(fā)送代碼
public static String post(String head, String body) throws BusinessException {
        FormDataMultiPart multiPart = new FormDataMultiPart();
        multiPart.field(RequestField.HeadFieldName, head, MediaType.MULTIPART_FORM_DATA_TYPE);
        multiPart.field(RequestField.BodyFieldName, body, MediaType.MULTIPART_FORM_DATA_TYPE);
        return webResource.type("multipart/form-data").post(String.class, multiPart);
    }

// Server端接收代碼
          @POST
    @Produces({MediaType.APPLICATION_XML, MediaType.MULTIPART_FORM_DATA})
    @Consumes({MediaType.APPLICATION_XML, MediaType.MULTIPART_FORM_DATA})   
    public String service(FormDataMultiPart multiPart) throws Exception{
        if(multiPart == null){
            if(_logger.isErrorEnabled()){
                _logger.error("the request FormDataMultiPart is null");
            }

            throw new Exception("the request FormDataMultiPart is null");
        }

        List<RequestField> requestFields = new ArrayList<RequestField>();
        for(BodyPart bodyPart : multiPart.getBodyParts()){
            String fieldName = ((FormDataBodyPart)bodyPart).getName().trim();
            if(fieldName.equalsIgnoreCase(RequestField.HeadFieldName)){
                requestFields.add(new RequestField(fieldName, bodyPart.getEntityAs(String.class)));
            }
            else if(fieldName.equalsIgnoreCase(RequestField.BodyFieldName)){
                requestFields.add(new RequestField(fieldName, bodyPart.getEntityAs(String.class)));
            }
            else{
                if(_logger.isWarnEnabled()){
                    _logger.warn("invalid fieldName:" + fieldName + ",originXml:" + bodyPart.getEntityAs(String.class));
                }
            }
        }

        .....
    }

用工具抓包的實際post報文:
復(fù)制代碼 代碼如下:

POST /ba/resources/bossServer HTTP/1.1
Content-Type: multipart/form-data;boundary=Boundary_1_30911772_1367997277472
MIME-Version: 1.0
User-Agent: Java/1.6.0_10-rc2
Host: 192.168.245.18:8082
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive
Content-Length: 1600
--Boundary_1_30911772_1367997277472
Content-Disposition: form-data;name="xmlhead"
Content-Type: multipart/form-data

<?xml version="1.0" encoding="UTF-8"?>
<InterBOSS>
    <Version>0100</Version>
    <TestFlag>0</TestFlag>
    <BIPType>
        <BIPCode>BIP2B543</BIPCode>
        <ActivityCode>T2001543</ActivityCode>
        <ActionCode>0</ActionCode>
    </BIPType>
    <RoutingInfo>
        <OrigDomain>IMPS</OrigDomain>
        <RouteType>01</RouteType>
        <Routing>
            <HomeDomain>BOSS</HomeDomain>
            <RouteValue>13810494631</RouteValue>
        </Routing>
    </RoutingInfo>
    <TransInfo>
        <SessionID>2013050815143783928824</SessionID>
        <TransIDO>2013050815143783928824</TransIDO>
        <TransIDOTime>20130508151437</TransIDOTime>
    </TransInfo>
</InterBOSS>
--Boundary_1_30911772_1367997277472
Content-Disposition: form-data;name="xmlbody"
Content-Type: multipart/form-data

<?xml version="1.0" encoding="UTF-8"?>
<InterBOSS>
<SvcCont><![CDATA[<subscribeServiceReq>
    <msgTransactionID>210001BIP2B543130508151437477294</msgTransactionID>
    <subscribeServInfo>
        <oprTime>20130508151436</oprTime>
        <actionID>06</actionID>
        <effTime>20130508151437</effTime>
        <expireTime>30000101000000</expireTime>
        <feeUser_ID>13810494631</feeUser_ID>
        <destUser_ID>13810494631</destUser_ID>
        <actionReasonID>1</actionReasonID>
        <servType>210001</servType>
        <subServType>FXCJHY</subServType>
        <SPID>901508</SPID>
        <SPServID>FXCJHY</SPServID>
        <accessMode>01</accessMode>
        <feeType>2</feeType>
    </subscribeServInfo>
</subscribeServiceReq>]]></SvcCont>
</InterBOSS>
--Boundary_1_30911772_1367997277472--

相關(guān)文章

  • 詳解Spring中使用@within與@target的區(qū)別

    詳解Spring中使用@within與@target的區(qū)別

    這篇文章主要介紹了Spring中使用@within與@target的一些區(qū)別,本文通過項目案例給大家詳細(xì)分析,給大家介紹的非常詳細(xì),代碼簡單易懂,需要的朋友可以參考下
    2021-09-09
  • 解決mybatis-plus新增數(shù)據(jù)自增ID變無序問題

    解決mybatis-plus新增數(shù)據(jù)自增ID變無序問題

    這篇文章主要介紹了解決mybatis-plus新增數(shù)據(jù)自增ID變無序問題,具有很好的參考價值,希望對大家有所幫助。
    2023-07-07
  • Java中Controller、Service、Dao/Mapper層的區(qū)別與用法

    Java中Controller、Service、Dao/Mapper層的區(qū)別與用法

    在Java開發(fā)中,通常會采用三層架構(gòu)(或稱MVC架構(gòu))來劃分程序的職責(zé)和功能,分別是Controller層、Service層、Dao/Mapper層,本文將詳細(xì)給大家介紹了三層的區(qū)別和用法,需要的朋友可以參考下
    2023-05-05
  • Spring事務(wù)不生效的8種原因小結(jié)

    Spring事務(wù)不生效的8種原因小結(jié)

    Spring事務(wù)會在幾種特定的場景下失效,本文主要介紹了Spring事務(wù)不生效的8種原因小結(jié),具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • SpringCloud+RocketMQ實現(xiàn)分布式事務(wù)的實踐

    SpringCloud+RocketMQ實現(xiàn)分布式事務(wù)的實踐

    分布式事務(wù)已經(jīng)成為了我們的經(jīng)常使用的。所以我們來一步一步的實現(xiàn)基于RocketMQ的分布式事務(wù)。感興趣的可以了解一下
    2021-10-10
  • 動態(tài)代理模擬實現(xiàn)aop的示例

    動態(tài)代理模擬實現(xiàn)aop的示例

    下面小編就為大家?guī)硪黄獎討B(tài)代理模擬實現(xiàn)aop的示例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望對大家有所幫助
    2017-11-11
  • 詳解springboot+aop+Lua分布式限流的最佳實踐

    詳解springboot+aop+Lua分布式限流的最佳實踐

    這篇文章主要介紹了詳解springboot+aop+Lua分布式限流的最佳實踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • MyBatis-Plus 之selectMaps、selectObjs、selectCount、selectOne的使用

    MyBatis-Plus 之selectMaps、selectObjs、selectCount、selectO

    本文主要介紹了MyBatis-Plus 之selectMaps、selectObjs、selectCount、selectOne的使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Spring詳細(xì)講解@Autowired注解

    Spring詳細(xì)講解@Autowired注解

    @Autowired注解可以用在類屬性,構(gòu)造函數(shù),setter方法和函數(shù)參數(shù)上,該注解可以準(zhǔn)確地控制bean在何處如何自動裝配的過程。在默認(rèn)情況下,該注解是類型驅(qū)動的注入
    2022-06-06
  • java獲取服務(wù)器基本信息的方法

    java獲取服務(wù)器基本信息的方法

    這篇文章主要介紹了java獲取服務(wù)器基本信息的方法,涉及java獲取系統(tǒng)CPU、內(nèi)存及操作系統(tǒng)等相關(guān)信息的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07

最新評論