[JAVA]使用Jersey处理Http协议中的Multipart
[JAVA]使用Jersey处理Http协议中的Multipart
之前在基于C#开发彩信用最原始的StringBuilder拼接字符串方式处理过Multipart。现在在做一个项目的时候,由于之前的技术路线都是使用Jersey处理Http这块,为了保持技术路线一致,研究了一下如何使用Jersey处理Http协议中的Multipart。
那么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--
标签: JAVA
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于使用Jersey处理Http协议中的Multipart的详细内容...