基于JAVA中Jersey处理Http协议中的Multipart的详解

2016-02-19 09:55 4 1 收藏

下面,图老师小编带您去了解一下基于JAVA中Jersey处理Http协议中的Multipart的详解,生活就是不断的发现新事物,get新技能~

【 tulaoshi.com - 编程语言 】

     那么Http协议中的Multipart是个什么东东?下面是摘抄http协议1.1的一段话:
在multipart entity(多部分实体)的例子中,一个或多个不同的数据集合并在一个单一的body(体)中,一个"multipart"(多部分)类型 field的(域)必须出现在实体的header(头域)。body(体)必须包括一个或多个body part(体部分),每一个位于boundary(边界)定界符线之前,最后一个则跟着一个结束边界定界符线。在它的边界定界符线后,每一个体部分由头域、空行、体组成。
     上面的描述写的有点拗口,简单的理解可以为:一个post的请求,可以根据一定规范去定义多个部分;

     下面用移动网状网协议(其实就是一个请求中包括2个独立的xml内容,一个head的xml,一个body的xml)去举例说明如何利用Jersey处理Multipart,主要代码如下(开始的时候server端接收的代码死活不知道如何写也没查到别人怎么写的,后来一生气,反编译jersey-multipart-1.0.3.1.jar包的代码看了下,才明白):
代码如下:

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

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

 
// Client发送代码
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");
        }

        ListRequestField requestFields = new ArrayListRequestField();
        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报文:
代码如下:

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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

?xml version="1.0" encoding="UTF-8"?
InterBOSS
    Version0100/Version
    TestFlag0/TestFlag
    BIPType
        BIPCodeBIP2B543/BIPCode
        ActivityCodeT2001543/ActivityCode
        ActionCode0/ActionCode
    /BIPType
    RoutingInfo
        OrigDomainIMPS/OrigDomain
        RouteType01/RouteType
        Routing
            HomeDomainBOSS/HomeDomain
            RouteValue13810494631/RouteValue
        /Routing
    /RoutingInfo
    TransInfo
        SessionID2013050815143783928824/SessionID
        TransIDO2013050815143783928824/TransIDO
        TransIDOTime20130508151437/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
    msgTransactionID210001BIP2B543130508151437477294/msgTransactionID
    subscribeServInfo
        oprTime20130508151436/oprTime
        actionID06/actionID
        effTime20130508151437/effTime
        expireTime30000101000000/expireTime
        feeUser_ID13810494631/feeUser_ID
        destUser_ID13810494631/destUser_ID
        actionReasonID1/actionReasonID
        servType210001/servType
        subServTypeFXCJHY/subServType
        SPID901508/SPID
        SPServIDFXCJHY/SPServID
        accessMode01/accessMode
        feeType2/feeType
    /subscribeServInfo
/subscribeServiceReq]]/SvcCont
/InterBOSS
--Boundary_1_30911772_1367997277472--

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

来源:https://www.tulaoshi.com/n/20160219/1592639.html

延伸阅读
Java编程中的异常处理是一个很常见的话题了,几乎任何一门介绍性的Java课程都会提到异常处理。不过,我认为很多人其实并没有真正把握正确处理异常情况的方法和策略,最多也就不过了解个大概,知道点概念。本文就对三种不同程度和质量的Java异常处理进行了讨论,所阐述的处理异常的方式按手法的高下分为: 好,不好和恶劣三种。 同时向...
■JDBC ODBC Bridge的Bug及其解决方法 !-- frame contents -- !-- /frame contents -- 在编写一数据库治理程序时,发现JDBC-ODBC Bridge存在不易发现的Bug。在向数据表插入数据时,假如为英文字符,存储内容完全正确,假如存入中文字符,部分数据库只能存储前七八个中文字符,其他内容被截去,导致存储内容的不完整(有...
1,什么是字符编码?     字符(Character)是文字与符号的总称,包括文字、图形符号、数学符号等。一组抽象字符的集合就是字符集(Charset)。字符集的出现是为了信息进行传播储存提供方便。目前常用到字符集有:ASCII,ISO 8859-1,Unicode,GB2312 2,各种编码集有哪些特点? ASCII:     ASCII(Ameri...
首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList、Vector和LinkedList。List用于存放多个元素,能够维护元素的次序,并且允许元素的重复。 3个具体实现类的相关区别如下: 1.ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小...
什么是UDP协议 UDP协议的全称是用户数据报,在网络中它与TCP协议一样用于处理数据包。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。 为什么要使用UDP 在选择使用协议的时候,选择UDP必须要谨慎。在网络...

经验教程

885

收藏

35
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部