httpurlconnection post提交raw格式数据
HttpURLConnection可以post上传任意格式的raw文本,包括text、json、xml、html等数据。其实就是post的时候,不指定key键,直接将需要传参的数据输出,即是 getOutputStream().write(data)。
实现代码
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.Map;
public class HttpPostRaw {
// 设置连接主机服务器的超时时间:15000毫秒
private final int CONNECT_TIMEOUT = 15000;
// 设置读取远程返回的数据时间:60000毫秒
private final int READ_TIMEOUT = 60000;
private HttpURLConnection httpConn;
private String postData;
private String charset;
/**
* 构造方法
*
* @param requestURL 请求地址
* @param charset 请求的编码
* @param headers 请求头
* @param postData 请求字段
* @throws IOException
*/
public HttpPostRaw(String requestURL, String charset, Map<String, String> headers, String postData) throws IOException {
this.charset = charset;
this.postData = postData;
URL url = new URL(requestURL);
httpConn = (HttpURLConnection) url.openConnection();
httpConn.setConnectTimeout(CONNECT_TIMEOUT);
httpConn.setReadTimeout(READ_TIMEOUT);
httpConn.setUseCaches(false);
httpConn.setDoOutput(true); // 表明是post请求
httpConn.setDoInput(true);
httpConn.setRequestProperty("Content-Type", "text/plain");
if (headers != null && headers.size() > 0) {
Iterator<String> it = headers.keySet().iterator();
while (it.hasNext()) {
String key = it.next();
String value = headers.get(key);
httpConn.setRequestProperty(key, value);
}
}
}
public HttpPostRaw(String requestURL, String charset, Map<String, String> headers) throws IOException {
this(requestURL, charset, headers, null);
}
public HttpPostRaw(String requestURL, String charset) throws IOException {
this(requestURL, charset, null, null);
}
/**
* 添加请求头
*
* @param key
* @param value
*/
public void addHeader(String key, String value) {
httpConn.setRequestProperty(key, value);
}
/**
* 设置请求数据
* @param postData
*/
public void setPostData(String postData) {
this.postData = postData;
}
/**
* 将请求字段转化成byte数组
*
* @return
*/
private byte[] getParamsByte() {
byte[] result = null;
try {
result = this.postData.toString().getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return result;
}
/**
* 对键和值进行url编码
*
* @param data
* @return
*/
private String encodeParam(String data) {
String result = "";
try {
result = URLEncoder.encode(data, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return result;
}
/**
* 完成请求,并接受服务器的回应
*
* @return 如果请求成功,状态码是200,返回服务器返回的字符串,否则抛出异常
* @throws IOException
*/
public String finish() throws IOException {
String response = "";
byte[] postDataBytes = this.getParamsByte();
httpConn.getOutputStream().write(postDataBytes);
// 检查服务器返回状态
int status = httpConn.getResponseCode();
if (status == HttpURLConnection.HTTP_OK) {
ByteArrayOutputStream result = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = httpConn.getInputStream().read(buffer)) != -1) {
result.write(buffer, 0, length);
}
response = result.toString(this.charset);
httpConn.disconnect();
} else {
throw new IOException("Server returned non-OK status: " + status);
}
return response;
}
}
调用示例
try {
HttpPostRaw post = new HttpPostRaw("http://localhost/json", "utf-8");
String json = "{\"id\":\"288285\",\"value\":\"测试\"}";
post.setPostData(json);
post.addHeader("Content-Type", "application/json");
String out = post.finish();
System.out.println(out);
} catch (Exception e) {
e.printStackTrace();
}