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

     那么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");
        }

        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报文:

复制代码 代码如下:

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--

时间: 2024-09-20 15:44:04

基于JAVA中Jersey处理Http协议中的Multipart的详解_java的相关文章

Eclipse中改变默认的workspace的方法及说明详解_java

eclipse中改变默然的workspace的方法可以有以下几种: 1.在创建project的时候,手动选择使用新的workspace,如创建一个web project,在向导中的Location选项,取消使用"Use default location",同时在下面选择新的workspace. 2.在file菜单中选择switch workspace项,即可选择一个新的workspace 3.在eclipse安装目录下configuration/.settings目录下的 org.ec

Java的MyBatis框架中关键的XML字段映射的配置参数详解_java

properties这些是外部化的,可替代的属性,这些属性也可以配置在典型的Java属性配置文件中,或者通过properties元素的子元素来传递.例如: <properties resource="org/mybatis/example/config.properties"> <property name="username" value="dev_user"/> <property name="pass

Java Spring Controller 获取请求参数的几种方法详解_java

Java Spring Controller 获取请求参数的几种方法  1.直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于post方式提交.若"Content-Type"="application/x-www-form-urlencoded",可用post提交        url形式:http://localhost:8080/SSMDemo/demo/addUser1?username=lixiaoxi&pas

java全角、半角字符的关系以及转换详解_java

如果搞明白了Java中全角字符和半角字符之间的关系 那他们之间的转换根本就不是个事. 全角字符与半角字符的关系 可以通过下面的程序看看Java中所有字符以及对应编码的值 复制代码 代码如下:     public static void main(String[] args) {        for (int i = Character.MIN_VALUE; i <= Character.MAX_VALUE; ++i) {            System.out.println(i + &qu

java中Struts2文件上传问题详解_java

首先是网页部分,upload_file.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML> <html> <head> <title>Upload File</title> </head> <body> <form act

Mybatis中的resultType和resultMap查询操作实例详解_java

resultType和resultMap只能有一个成立,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,resultMap解决复杂查询是的映射问题.比如:列名和对象属性名不一致时可以使用resultMap来配置:还有查询的对象中包含其他的对象等. MyBatisConfig.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configura

iOS 泛型中nullable、null resettable、null kindof 用法详解_IOS

 iOS9新出的关键字:用来修饰属性,或者方法的参数,方法的返回值 iOS9新出关键字nonnull,nullable,null_resettable,_Null_unspecified 需要注意的一点只能修饰对象,不能修饰基本数据类型. 虽然在项目的代码编写中不会经常用到,不过在调用苹果系统方法的时候还是会经常遇到,需要做一个总结 nullable作用:表示可以为空 nullable书写规范: // 方式一: @property (nonatomic, strong, nullable) NS

JS中call/apply、arguments、undefined/null方法详解_javascript技巧

a.call和apply方法详解 -------------------------------------------------------------------------------- call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指

为excel vba中添加、删除模块并插入全过程图文详解

  为excel vba中添加.删除模块并插入全过程图文详解         方法/步骤 1.点按快速启动栏excel 程序图标 进入excel 界面 点击选中任意单元格 然后按alt+f11 进入vbe界面 2.点击菜单栏 插入命令 在弹出的活动菜单中点按模块命令 3.另一种方式插入模块的方法可以在工程资管管理器中鼠标点击空白处 右键单击鼠标 在弹出的快捷菜单中选择插入命令 二级菜单中选择模块命令 4.如图所示模块1.模块2分别是通过菜单栏插入命令 和工程资源管理器点击右键创建的模块 5.如果