模拟http协议的类型为multipart/form-data的post请求

 最近写了一个小demo,调用淘宝的api,来完成一个添加/更新销售属性图片的功能,程序的流程如下图所示:


程序要做的是,把接收到的数据组装成参数传递给淘宝的服务器。

一、在模拟post请求之前,先看一下,客户端发送过来的内容

客户端jsp页面中内容如下:

代码:

  <form action="operation/updateImgServlet" id="updateImgForm" name="updateImgForm" method="post" enctype="multipart/form-data" >
    	<input type="hidden"  name="properties" value="<%=properties%>"/>
    	<input type="hidden"  name="id" value="<%=id %>"/>
    	<input type="hidden"  name="iid" value="<%=iid %>"/>
    	颜色别名:<input type="text" name="nameAlias" id="nameAlias"></input>
    	上传图片:<input type="file" name="imgPath" id="imgPath"></input>
    	<input type="submit" name="updateImg" id="updateImg" value="提交" />
    </form>

 上传文件后,可以得到post请求,内容如下:


注意:1、在绿框中是,图片的二进制内容,省略了很多
         2、第一个黄框中的内容,指定了发送内容的类型和分隔符

         3、第二个黄框表明发送的内容是图片

         4、最重要的是,上面的格式必须一字不差,包括最后的回车

二、下面来模拟post请求

使用java.net.HttpURLConnection来建立连接

1、组装需要发送的内容

代码如下:

//按照HTTP的协议内容标准格式发送信息
		String BOUNDARY = "---------------------------198152288819156"; // 分隔符
		StringBuffer sb = new StringBuffer();
		// 发送每个字段:
		for (Iterator<Map.Entry<String, String>> it = apiparamsMap.entrySet().iterator(); it.hasNext();) {
			Map.Entry<String, String> e = it.next();
			sb = sb.append("--");
			sb = sb.append(BOUNDARY);
			sb = sb.append("\r\n");
			sb = sb.append("Content-Disposition: form-data; name=\""+ e.getKey() + "\"\r\n\r\n");
			sb = sb.append(e.getValue());
			sb = sb.append("\r\n");
		}
		// 发送图片:
		sb = sb.append("--");
		sb = sb.append(BOUNDARY);
		sb = sb.append("\r\n");
		sb = sb.append("Content-Disposition: form-data; name=\""+name+"\"; filename=\""+path+"\"\r\n");
		sb = sb.append("Content-Type: Content-Type: image/jpeg\r\n\r\n");
		byte[] data = sb.toString().getBytes();
		byte[] end_data = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();

  2、建立连接,发送请求内容

代码如下:

URL url = null;
		HttpURLConnection connection = null;
			//建立连接
			url = new URL(DemoConstant.SANDBOX_URL);
			connection = (HttpURLConnection) url.openConnection();
			connection.setDoOutput(true);
			connection.setDoInput(true);
			connection.setRequestMethod("POST");
			connection.setRequestProperty("Content-Type", "multipart/form-data; boundary="+BOUNDARY);
			connection.setRequestProperty("Content-Length", String.valueOf(data.length + file.length + end_data.length));
			connection.setUseCaches(false);
			connection.connect();

			//发送参数
			DataOutputStream out = new DataOutputStream(connection.getOutputStream());
			out.write(data);
			out.write(file);
			out.write(end_data);
		
			out.flush();
			out.close();
 

 

 注意:

1、设置Content-Type为multipart/form-data;boundary=---------------------------198152288819156

2、file为待上传的图片二进制内容

3、发送顺序发送参数

4、如果你的参数中是带有中文字符的,请注意输出的字符集编码,如果使用的都是utf-8的编码格式,则在输出时,将内容转化成utf-8,再输出,如out.write(content.getBytes("utf-8"));

3、获得结果

代码如下:

BufferedReader reader = new BufferedReader(new InputStreamReader(connection
					.getInputStream(), "utf-8"));
			StringBuffer buffer = new StringBuffer();
			String line = "";
			while ((line = reader.readLine()) != null) {
				buffer.append(line);
			}
			reader.close();
			return buffer.toString();

 buffer.toString即使返回的结果,对其可以进行其他处理工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值