下面給出一段示例代碼,這個代碼採用了三種方式與網絡交互,分別指直接只用URL對象和使用URLConnection的Get與Post方式,並且爲URLConnection的Get與Post方式提供了一個工具類。
這個程序的佈局頁面很簡單,包括三個按鈕和一個標籤,如下圖,分別用來發送三種請求和顯示服務器消息
Activity代碼:
package com.example.hellourl;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import com.example.web.GetPostUtil;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
@SuppressLint("HandlerLeak")
public class MainActivity extends Activity {
//頁面組件
TextView txt;
//URL按鈕
Button btn;
//發送GET請求按鈕
Button btnGet;
//發送POST請求按鈕
Button btnPost;
//服務器返回的消息
String message = "";
//服務器地址
String urlStr = "http://192.168.9.160:8080/WebTest2/servlet/ConnServlet?name='zz'&pwd='234'";
String getUrlStr = "http://192.168.9.160:8080/WebTest2/servlet/ConnServlet";
String postUrlStr = "http://192.168.9.160:8080/WebTest2/servlet/ConnServlet";
Handler hander = new Handler(){
@Override
public void handleMessage(Message msg){
if(msg.what == 0x123){
txt.setText(message);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//獲取頁面按鈕
btn = (Button) findViewById(R.id.button1);
btnGet = (Button) findViewById(R.id.btnGet);
btnPost = (Button) findViewById(R.id.btnPost);
//獲取頁面顯示服務器返回消息的標籤
txt = (TextView) findViewById(R.id.textView1);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
new Thread(){
public void run(){
try {
//訪問服務器
//創建URL對象
URL url = new URL(urlStr);
//打開URL對應的資源輸入流
InputStream in = url.openStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
message = new String(br.readLine().getBytes(),"UTF-8");
//發送消息,通知UI組件顯示服務器返回消息
hander.sendEmptyMessage(0x123);
br.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
});
btnGet.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
new Thread(){
public void run(){
message = GetPostUtil.sendGet(getUrlStr,
"name='lili'&pwd='123'");
//發送消息,通知UI組件顯示服務器返回消息
hander.sendEmptyMessage(0x123);
}
}.start();
}
});
btnPost.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
new Thread(){
public void run(){
message = GetPostUtil.sendPost(postUrlStr,
"name='xiaoming'&pwd='321'");
//發送消息,通知UI組件顯示服務器返回消息
hander.sendEmptyMessage(0x123);
}
}.start();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
URLConnection工具類:
package com.example.web;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;
public class GetPostUtil {
/**
* 向指定URL發送GET方法的請求
* @param url 被請求的url
* @param param 請求參數 格式:name1=value1&name2=value2
* @return 遠程資源的響應信息
*/
public static String sendGet(String url,String param){
String result = "";
BufferedReader in = null;
try {
String urlStr = url + "?" +param;
URL urlObj = new URL(urlStr);
URLConnection conn = urlObj.openConnection();
//設置通用的請求屬性
conn.setRequestProperty("Accept-Language", "zh-cn");
conn.setRequestProperty("Charset", "utf-8");
//建立實際的連接
conn.connect();
//獲取所有響應頭字段
Map<String,List<String>> map = conn.getHeaderFields();
for(String key:map.keySet()){
System.out.println("服務器返回頭信息"+key+":"+map.get(key));
}
//定義BufferedReader輸入流來讀取URL的響應
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while((line = in.readLine())!=null){
result += "\n" + line;
}
} catch (Exception e) {
System.out.println("發送GET請求出現異常\n"+e);
}finally{
try{
if(in!=null){
in.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
return result;
}
/**
* 向指定URL發送POST方法的請求
* @param url 被請求的url
* @param param 請求參數 格式:name1=value1&name2=value2
* @return 遠程資源的響應信息
*/
public static String sendPost(String url,String param){
String result = "";
BufferedReader in = null;
PrintWriter out = null;
try {
URL urlObj = new URL(url);
//打開和URL之間的連接
URLConnection conn = urlObj.openConnection();
//設置通用的請求屬性
conn.setRequestProperty("Charset", "utf-8");
//發送POST請求必須設置如下兩項
conn.setDoOutput(true);
conn.setDoInput(true);
//獲取URLConnection對應的輸出流
out = new PrintWriter(conn.getOutputStream());
//發送請求參數
out.print(param);
out.flush();
//定義BufferedReader輸入流來讀取URL的響應
in = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));
String line;
while((line = in.readLine())!=null){
result += "\n" + line;
}
} catch (Exception e) {
System.out.println("發送POST請求出現異常\n"+e);
}finally{
try{
if(out!=null){
out.close();
}
if(in!=null){
in.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
return result;
}
}
服務器Servlet代碼
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
System.out.println(name+":"+pwd);
request.setAttribute("name", "姓名:"+name);
request.setAttribute("pwd", "密碼"+pwd);
out.println(name+"GET方式web訪問成功");
out.flush();
out.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
System.out.println(name+":"+pwd);
request.setAttribute("name", "姓名:"+name);
request.setAttribute("pwd", "密碼"+pwd);
out.println(name+"POST方式訪問web成功");
out.flush();
out.close();
}