之前在基于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--
相关推荐
本文将深入探讨如何使用Jersey处理HTTP协议中的Multipart,这对于上传文件或者处理包含多个部分的数据尤为关键。 HTTP协议中的Multipart是一个标准,允许在一个单一的HTTP请求中发送多个不同类型的数据。它常用于...
【jersey所需最新jar包】涉及的是Java Web开发中的一个重要组件——Jersey,这是一个开源的RESTful服务框架,基于JAX-RS(Java API for RESTful Web Services)规范实现。在Java开发中,Jersey提供了创建、部署和...
本文将深入探讨Jersey的核心概念、功能以及如何在项目中使用它。 1. **Jersey简介** Jersey是JAX-RS(Java API for RESTful Web Services)规范的实现,JAX-RS是Java EE的一部分,用于简化REST服务的开发。通过...
通过这个 Jersey 服务 Demo,你可以了解如何使用 Jersey 构建 RESTful 服务,并处理包括图片在内的不同类型的资源。进一步学习和实践,将有助于你更好地理解和应用 RESTful 服务设计原则以及 Jersey 框架的高级特性...
- `jersey-media-multipart`:支持多部分/表单数据的处理。 - `jersey-guice`:Guice依赖注入模块。 - `jersey-test-framework`:测试框架相关组件。 - `javadoc`:API文档。 - `examples`:示例代码,帮助开发者...
3. **特定模块**:根据项目需求,可能还包括额外的模块,如jersey-client(客户端支持)、jersey-media-multipart(处理多媒体内容)或jersey-hk2(集成 hk2 服务容器)等。 将这些JAR包放入项目的“lib”目录后,...
`jersey-multipart-1.19.4.jar` 是用于JAX-RS(Java API for RESTful Web Services)的扩展,提供了处理multipart/form-data请求的能力,这是HTTP协议中用于文件上传的标准格式。Jersey是Google的Gson库的一个补充...
通过使用 Jersey,我们可以轻松地创建和消费 RESTful API,它提供了一种简洁的编程模型,使得开发者可以专注于业务逻辑,而不用关心底层 HTTP 协议的细节。 接下来是 Jetty。Jetty 是一个轻量级、高性能的嵌入式 ...
在IT行业中,RESTful WebService框架是开发网络应用的重要工具,Jersey作为Java平台上的一个开源框架,专门用于实现RESTful服务。本文将深入探讨如何巧妙利用Jersey框架解决文件上传时可能出现的乱码问题,同时也会...
`commons-fileupload-1.2.1.jar`是Apache Commons FileUpload项目的实现,这是一个用于处理HTTP协议中的多部分表单数据的组件。在Web应用中,当用户通过HTML表单上传文件时,服务器端就需要使用这样的工具来解析请求...
在处理文件上传时,Jersey利用了HTTP协议中的multipart/form-data类型,这是用于上传文件的标准格式。 第一种文件上传方式是使用`@FormDataParam`注解。这种方式下,你需要在服务端的方法参数上使用此注解来接收...
在Maven项目中,你会在pom.xml文件中看到jersey相关的依赖,如`jersey-container-servlet-core`、`jersey-media-multipart`等,这些依赖用于提供HTTP容器集成和处理不同媒体类型的能力。 接下来,查看项目中的源...
在Java中实现RESTful接口,通常会使用到以下几种关键的jar包: 1. **JAX-RS**:Java API for RESTful Web Services,是Java官方提供的一套用于创建RESTful Web服务的标准API。常见的JAX-RS实现有Apache CXF、Jersey...
在这个场景中,我们将讨论如何使用Java的Jersey库来创建一个REST Web服务器,支持POST方式的文件上传,并提供一个完整的DEMO供用户下载运行。 首先,让我们了解REST的基本原则。REST强调资源的表述,通过HTTP方法...
描述中提到“Restful API使用到的jar包”,表明 Jersey(jaxrs-ri-2.21) 是用于开发 RESTful API 的工具包,其中包含了一系列的 `.jar` 文件,这些文件提供了必要的类库和功能,帮助开发者构建符合 REST 设计原则的...
Jersey作为Java的RESTful Web服务框架,提供了一套完整的解决方案来处理文件上传请求。本示例将详细介绍如何在Jersey服务器端实现文件上传。 1. **Jersey简介** Jersey是基于JAX-RS(Java API for RESTful Web ...
在JAX-RS中实现文件上传,我们需要使用`@FormDataParam`注解来处理HTTP请求中的多部分数据。例如,我们可以创建一个POST方法,接收一个名为"file"的参数,该参数对应于上传的文件: ```java @POST @Path("/upload")...