`
dyllove98
  • 浏览: 1403536 次
  • 性别: Icon_minigender_1
  • 来自: 济南
博客专栏
73a48ce3-d397-3b94-9f5d-49eb2ab017ab
Eclipse Rcp/R...
浏览量:38978
4322ac12-0ba9-3ac3-a3cf-b2f587fdfd3f
项目管理checkList...
浏览量:79957
4fb6ad91-52a6-307a-9e4f-816b4a7ce416
哲理故事与管理之道
浏览量:133073
社区版块
存档分类
最新评论

[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中Jersey处理Http协议中的Multipart的详解

    本文将深入探讨如何使用Jersey处理HTTP协议中的Multipart,这对于上传文件或者处理包含多个部分的数据尤为关键。 HTTP协议中的Multipart是一个标准,允许在一个单一的HTTP请求中发送多个不同类型的数据。它常用于...

    jersey所需最新jar包

    【jersey所需最新jar包】涉及的是Java Web开发中的一个重要组件——Jersey,这是一个开源的RESTful服务框架,基于JAX-RS(Java API for RESTful Web Services)规范实现。在Java开发中,Jersey提供了创建、部署和...

    jersey 开发所需jar

    本文将深入探讨Jersey的核心概念、功能以及如何在项目中使用它。 1. **Jersey简介** Jersey是JAX-RS(Java API for RESTful Web Services)规范的实现,JAX-RS是Java EE的一部分,用于简化REST服务的开发。通过...

    jersey服务demo

    通过这个 Jersey 服务 Demo,你可以了解如何使用 Jersey 构建 RESTful 服务,并处理包括图片在内的不同类型的资源。进一步学习和实践,将有助于你更好地理解和应用 RESTful 服务设计原则以及 Jersey 框架的高级特性...

    jersey的开发包

    - `jersey-media-multipart`:支持多部分/表单数据的处理。 - `jersey-guice`:Guice依赖注入模块。 - `jersey-test-framework`:测试框架相关组件。 - `javadoc`:API文档。 - `examples`:示例代码,帮助开发者...

    构建 jersey+restful 所需JAR包

    3. **特定模块**:根据项目需求,可能还包括额外的模块,如jersey-client(客户端支持)、jersey-media-multipart(处理多媒体内容)或jersey-hk2(集成 hk2 服务容器)等。 将这些JAR包放入项目的“lib”目录后,...

    java文件上传常用jar包

    `jersey-multipart-1.19.4.jar` 是用于JAX-RS(Java API for RESTful Web Services)的扩展,提供了处理multipart/form-data请求的能力,这是HTTP协议中用于文件上传的标准格式。Jersey是Google的Gson库的一个补充...

    Jersey+Jetty框架简单搭建(包含文件上传下载)

    通过使用 Jersey,我们可以轻松地创建和消费 RESTful API,它提供了一种简洁的编程模型,使得开发者可以专注于业务逻辑,而不用关心底层 HTTP 协议的细节。 接下来是 Jetty。Jetty 是一个轻量级、高性能的嵌入式 ...

    巧用 Jersey RESTful WebService框架解决文件上传乱码

    在IT行业中,RESTful WebService框架是开发网络应用的重要工具,Jersey作为Java平台上的一个开源框架,专门用于实现RESTful服务。本文将深入探讨如何巧妙利用Jersey框架解决文件上传时可能出现的乱码问题,同时也会...

    java上传jar包

    `commons-fileupload-1.2.1.jar`是Apache Commons FileUpload项目的实现,这是一个用于处理HTTP协议中的多部分表单数据的组件。在Web应用中,当用户通过HTML表单上传文件时,服务器端就需要使用这样的工具来解析请求...

    jerseyUploadDemo:jersey upload demo 文件上传-使用两种不同的方式

    在处理文件上传时,Jersey利用了HTTP协议中的multipart/form-data类型,这是用于上传文件的标准格式。 第一种文件上传方式是使用`@FormDataParam`注解。这种方式下,你需要在服务端的方法参数上使用此注解来接收...

    Rest服务搭建范例

    在Maven项目中,你会在pom.xml文件中看到jersey相关的依赖,如`jersey-container-servlet-core`、`jersey-media-multipart`等,这些依赖用于提供HTTP容器集成和处理不同媒体类型的能力。 接下来,查看项目中的源...

    REST相关jar包

    在Java中实现RESTful接口,通常会使用到以下几种关键的jar包: 1. **JAX-RS**:Java API for RESTful Web Services,是Java官方提供的一套用于创建RESTful Web服务的标准API。常见的JAX-RS实现有Apache CXF、Jersey...

    rest webserverce 文件上传

    在这个场景中,我们将讨论如何使用Java的Jersey库来创建一个REST Web服务器,支持POST方式的文件上传,并提供一个完整的DEMO供用户下载运行。 首先,让我们了解REST的基本原则。REST强调资源的表述,通过HTTP方法...

    jaxrs-ri-2.21

    描述中提到“Restful API使用到的jar包”,表明 Jersey(jaxrs-ri-2.21) 是用于开发 RESTful API 的工具包,其中包含了一系列的 `.jar` 文件,这些文件提供了必要的类库和功能,帮助开发者构建符合 REST 设计原则的...

    jersey-server-fileUpload:文件上传示例

    Jersey作为Java的RESTful Web服务框架,提供了一套完整的解决方案来处理文件上传请求。本示例将详细介绍如何在Jersey服务器端实现文件上传。 1. **Jersey简介** Jersey是基于JAX-RS(Java API for RESTful Web ...

    file-upload-download-in-jaxrs

    在JAX-RS中实现文件上传,我们需要使用`@FormDataParam`注解来处理HTTP请求中的多部分数据。例如,我们可以创建一个POST方法,接收一个名为"file"的参数,该参数对应于上传的文件: ```java @POST @Path("/upload")...

Global site tag (gtag.js) - Google Analytics