最近写了一个小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即使返回的结果,对其可以进行其他处理工作。