HttpURLConnection post raw data
HttpURLConnection can post raw text in any format, such as text, json, xml, and html. In fact, you do not necessary to specify the field key when sending a request. Just write the data directly, using getOutputStream().write(data)
.
Example
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Iterator;
import java.util.Map;
public class HttpPostRaw {
// Set the connect timeout value in milliseconds
private final int CONNECT_TIMEOUT = 15000;
// Set the read timeout value in milliseconds
private final int READ_TIMEOUT = 60000;
private HttpURLConnection httpConn;
private String postData;
private String charset;
/**
* This constructor initializes a new HTTP POST request with content type
* is set to multipart/form-data
*
* @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); // indicates POST method
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);
}
/**
* Adds a header to the request
*
* @param key
* @param value
*/
public void addHeader(String key, String value) {
httpConn.setRequestProperty(key, value);
}
/**
* Adds a form field to the request
*
* @param postData
*/
public void setPostData(String postData) {
this.postData = postData;
}
/**
* Convert the request data to a byte array
*
* @return
*/
private byte[] getParamsByte() {
byte[] result = null;
try {
result = this.postData.toString().getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return result;
}
/**
* Completes the request and receives response from the server.
*
* @return String as response in case the server returned
* status OK, otherwise an exception is thrown.
* @throws IOException
*/
public String finish() throws IOException {
String response = "";
byte[] postDataBytes = this.getParamsByte();
httpConn.getOutputStream().write(postDataBytes);
// Check the http status
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;
}
}
Use it
try {
HttpPostRaw post = new HttpPostRaw("http://o2o-test.jdk5.com", "utf-8");
String json = "{\"id\":\"288285\",\"value\":\"test\"}";
post.setPostData(json);
post.addHeader("Content-Type", "application/json");
String out = post.finish();
System.out.println(out);
} catch (Exception e) {
e.printStackTrace();
}
This http request content look like:
POST /json HTTP/1.1
Content-Type: application/json
Cache-Control: no-cache
Pragma: no-cache
User-Agent: Java/1.8.0_211
Host: http://localhost
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Content-Length: 30
Connection: keep-alive
{"id":"288285","value":"test"}