Client:通過HTTP POST方式請求並接收返回數據。(用於請求別人的接口,並接收返回的數據)
Server:接收HTTP POST請求過來的數據並返回數據。(用於別人請求自己的接口,接收請求數據並返回數據)
下面是大致實現代碼:
Client:
public void test() {
try {
HttpServletResponse response = ServletActionContext.getResponse();
//設置返回數據的編碼類型
response.setCharacterEncoding("GBK");
String xml = "-<-?-xml -version=-"1.0-" -encoding=-"gb2312-" -?->"+
"-<-ddd->-"
//裏面若干XML數據,格式自己改下,被過濾了加些東西
"-<-/ddd->-";
String url = "請求地址";
HttpClient client = new HttpClient();
//設置代理服務器地址和端口
//client.getHostConfiguration().setProxy("proxy_host_addr",proxy_port);
//使用GET方法,如果服務器需要通過HTTPS連接,那只需要將下面URL中的http換成https
//HttpMethod method = new GetMethod("http://java.sun.com");
//使用POST方法
PostMethod post = new PostMethod(url);
//設置要發送請求的XML數據,這裏還可以不用直接發送XML數據,可以設置參數
//post.setParameter(key, value);
post.setRequestEntity(new StringRequestEntity(xml, "text/xml", "GBK"));
//執行請求
client.executeMethod(post);
//打印返回的信息
byte[] by = post.getResponseBody();
PrintWriter pw = response.getWriter();
pw.print(new String(by));
//釋放連接
post.releaseConnection();
} catch (Exception e) {
e.printStackTrace();
}
}
Server:
這裏是關鍵部分代碼
//------------接收物流方請求的XML數據-----------------------
//獲取request接收到的流長度,因爲這裏如果是使用Struts2框架,當發送方把Content-type
//設置成application/x-www-form-urlencoded會導致傳送過來的數據流被過濾掉
//如果這裏len不爲-1,而下面的br又爲空的話,說明被過濾掉了。
int len = request.getContentLength();
System.out.println("數據流長度:" +len);
//獲取HTTP請求的輸入流
InputStream is = request.getInputStream();
//已HTTP請求輸入流建立一個BufferedReader對象
BufferedReader br = new BufferedReader(new InputStreamReader(is,"UTF-8"));
//BufferedReader br = request.getReader();
//讀取HTTP請求內容
String buffer = null;
StringBuffer sb = new StringBuffer();
while ((buffer = br.readLine()) != null) {
//在頁面中顯示讀取到的請求參數
sb.append(buffer);
}
關於解決:request.getInputStream或request.getReader()被過濾掉的問題,可以用JSP先接收數據,然後再把content-type設置成xml/text類型再次請求真正的接口就可以接收到數據。我是這樣想到解決方法的,如果有朋友有更好的方法,請留言給個提示,我也去研究下。
這章內容雖然很簡單,但是對於新手的我們來說一出問題可能就會被弄得焦頭爛額,大家有興趣可以記下,呵呵
轉載地址:http://blog.csdn.net/liweibin_/article/details/8956957