HTTP POST請求最常見的用途是發(fā)送表單參數(shù)到服務(wù)器。除了發(fā)送表單數(shù)據(jù),還可以使用POST的消息Body體發(fā)送各種數(shù)據(jù)(如純文本、XML文檔等)。本文講述如何用Java將數(shù)據(jù)寫入POST請求的Body體,已經(jīng)在servlet獲取傳過來的數(shù)據(jù)。
package login;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
public class RequestPostTest {
public static void main(String[] args) throws Exception{
//發(fā)起post請求
String urlString="http://localhost:8080/PostDemo/login";
URL connectURL = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) connectURL.openConnection();
conn.setReadTimeout(100000);
conn.setConnectTimeout(100000);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("content-type", "text/html");//這行很重要,如果不設(shè)置的話,后面解析xml流的話,會報:Caused by: org.xml.sax.SAXParseException: Premature end of file.
// 得到請求的輸出流對象
OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream());
// 把數(shù)據(jù)寫入請求的Body
out.write("<?xml version='1.0' encoding='UTF-8'?><trans><tran><requestId>111111</requestId><orderNo>22222</orderNo></tran><tran><requestId>aaaa</requestId><orderNo>bbbb</orderNo></tran><tran><requestId>cccccc</requestId><orderNo>ddddd</orderNo></tran></trans>");
out.flush();
out.close();
//接收發(fā)起請求后由服務(wù)端返回的結(jié)果
int read;
StringBuffer inputb = new StringBuffer();
InputStream is = conn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(is, "UTF-8");
while ((read=inputStreamReader.read())>=0) {
inputb.append( (char) read);
}
System.out.println(inputb.toString());
}
}
獲取前段發(fā)過來的post數(shù)據(jù)
package login;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Login extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = -5376047309978396611L;
public void service(HttpServletRequest req, HttpServletResponse res)
throws IOException {
this.doPost(req,res);
}
public void doGet(HttpServletRequest request, HttpServletResponse res) throws IOException{
this.doPost(request,res);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{
// 測試
try {
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("SUCCESS");
ServletInputStream in = request.getInputStream();
String str = readLine(in);// 這里是前臺發(fā)起的所有參數(shù)的值,包括二進(jìn)制形式的文件和其它形式的文件
out.println(str);
out.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return;
}
/**
* Read the next line of input.
*
* @return a String containing the next line of input from the stream, or
* null to indicate the end of the stream.
* @exception IOException
* if an input or output exception has occurred.
*/
private String readLine(ServletInputStream in) throws IOException {
byte[] buf = new byte[8 * 1024];
StringBuffer sbuf = new StringBuffer();
int result;
// String line;
do {
result = in.readLine(buf, 0, buf.length); // does +=
if (result != -1) {
sbuf.append(new String(buf, 0, result, "UTF-8"));
}
} while (result == buf.length); // loop only if the buffer was filled
if (sbuf.length() == 0) {
return null; // nothing read, must be at the end of stream
}
// Cut off the trailing \n or \r\n
// It should always be \r\n but IE5 sometimes does just \n
int len = sbuf.length();
if (sbuf.charAt(len - 2) == '\r') {
sbuf.setLength(len - 2); // cut \r\n
} else {
sbuf.setLength(len - 1); // cut \n
}
return sbuf.toString();
}
}
posted on 2014-12-10 23:30
fly 閱讀(6533)
評論(0) 編輯 收藏