基于JAVA中Jersey处理Http协议中的Multipart的详解
那么Http协议中的Multipart是个什么东东?下面是摘抄http协议1.1的一段话:
在multipartentity(多部分实体)的例子中,一个或多个不同的数据集合并在一个单一的body(体)中,一个"multipart"(多部分)类型field的(域)必须出现在实体的header(头域)。body(体)必须包括一个或多个bodypart(体部分),每一个位于boundary(边界)定界符线之前,最后一个则跟着一个结束边界定界符线。在它的边界定界符线后,每一个体部分由头域、空行、体组成。
上面的描述写的有点拗口,简单的理解可以为:一个post的请求,可以根据一定规范去定义多个部分;
下面用移动网状网协议(其实就是一个请求中包括2个独立的xml内容,一个head的xml,一个body的xml)去举例说明如何利用Jersey处理Multipart,主要代码如下(开始的时候server端接收的代码死活不知道如何写也没查到别人怎么写的,后来一生气,反编译jersey-multipart-1.0.3.1.jar包的代码看了下,才明白):
privatestaticWebResourcewebResource=client.resource("http://xxx.xx.xx:xxx");
publicstaticfinalStringHeadFieldName="xmlhead";
publicstaticfinalStringBodyFieldName="xmlbody";
//Client发送代码
publicstaticStringpost(Stringhead,Stringbody)throwsBusinessException{
FormDataMultiPartmultiPart=newFormDataMultiPart();
multiPart.field(RequestField.HeadFieldName,head,MediaType.MULTIPART_FORM_DATA_TYPE);
multiPart.field(RequestField.BodyFieldName,body,MediaType.MULTIPART_FORM_DATA_TYPE);
returnwebResource.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})
publicStringservice(FormDataMultiPartmultiPart)throwsException{
if(multiPart==null){
if(_logger.isErrorEnabled()){
_logger.error("therequestFormDataMultiPartisnull");
}
thrownewException("therequestFormDataMultiPartisnull");
}
List<RequestField>requestFields=newArrayList<RequestField>();
for(BodyPartbodyPart:multiPart.getBodyParts()){
StringfieldName=((FormDataBodyPart)bodyPart).getName().trim();
if(fieldName.equalsIgnoreCase(RequestField.HeadFieldName)){
requestFields.add(newRequestField(fieldName,bodyPart.getEntityAs(String.class)));
}
elseif(fieldName.equalsIgnoreCase(RequestField.BodyFieldName)){
requestFields.add(newRequestField(fieldName,bodyPart.getEntityAs(String.class)));
}
else{
if(_logger.isWarnEnabled()){
_logger.warn("invalidfieldName:"+fieldName+",originXml:"+bodyPart.getEntityAs(String.class));
}
}
}
.....
}
用工具抓包的实际post报文:
POST/ba/resources/bossServerHTTP/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
<?xmlversion="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
<?xmlversion="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--
相关文章
- fileinputstream java,使用url的Java fileinputstream
- 004-protostuff踩坑-java bean新增字段反序列化失败问题
- Java四舍五入保留小数点后几位
- java 实现 按位异或_Java 按位异或的性质及其妙用
- java pfx_如何在Java中读取.pfx文件的内容?
- java启动器_JAVA基础:Java 启动器如何查找类
- java爬虫系列(一)——爬虫入门[通俗易懂]
- java文本框获得输入焦点_文本框获得焦点和失去焦点的判断代码
- 【说站】java数组初始化
- 【说站】Java泛型中有几种通配符
- 【测开技能】Java系列(二十 )初识面向对象编程
- JAVA string转map_java怎么转业务
- Think in Java之复用
- 一:Mongodb快速入门之使用Java操作Mongodb详解大数据
- JAVA支持HTTP断点续传详解编程语言
- Java处理HTTP请求的相关代码详解编程语言
- 数据库Java实现Oracle数据库监控(java监听oracle)
- 新手进阶:从Java开发到Linux系统架构(java转linux)
- 更新LINUX下的Java版本(linux更新java)
- MySQL连接Java:一步一步实现连接(mysql连接java)
- 自动提交MySQL事务中的Java自动提交实践(mysql事务java)
- 使用Java轻松导出MySQL数据(java导出mysql)
- MySQL与Java的数据交互之旅(mysql对应java)
- java使用Weka、Linux和Java构建强大的数据分析系统(weka linux)
- Linux系统下Java软件环境搭建指导(linux java软件)
- Java与Oracle同步一种新的数据库模式(java同步oracle)