要點
post提交數據是用流寫給服務器的
協議頭中多了兩個屬性
Content-Type: application/x-www-form-urlencoded,描述提交的數據的mimetype
Content-Length: 30,描述提交的數據的長度
//給請求頭添加post多出來的兩個屬性
String data = "name=" + URLEncoder.encode(name) + "&pass=" + pass;
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", data.length() + "");
設置允許打開post請求的流
conn.setDoOutput(true);
獲取連接對象的輸出流,往流裏寫要提交給服務器的數據
OutputStream os = conn.getOutputStream();
os.write(data.getBytes());
核心代碼
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
Toast.makeText(MainActivity.this, (String)msg.obj, 0).show();
}
};
public void click(View v){
EditText et_name = (EditText) findViewById(R.id.et_name);
EditText et_pass = (EditText) findViewById(R.id.et_pass);
final String name = et_name.getText().toString();
final String pass = et_pass.getText().toString();
Thread t = new Thread(){
@Override
public void run() {
//提交的數據需要經過url編碼,英文和數字編碼後不變
@SuppressWarnings("deprecation")
String path = "http://192.168.13.13/Web2/servlet/LoginServlet";
try {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
//拼接出要提交的數據的字符串
String data = "name=" + URLEncoder.encode(name) + "&pass=" + pass;
//添加post請求的兩行屬性
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", data.length() + "");
//設置打開輸出流
conn.setDoOutput(true);
//拿到輸出流
OutputStream os = conn.getOutputStream();
//使用輸出流往服務器提交數據
os.write(data.getBytes());
if(conn.getResponseCode() == 200){
InputStream is = conn.getInputStream();
String text = Utils.getTextFromStream(is);
Message msg = handler.obtainMessage();
msg.obj = text;
handler.sendMessage(msg);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
t.start();
}
}
getTextFromStream
public static String getTextFromStream(InputStream is){
byte[] b = new byte[1024];
int len = 0;
//創建字節數組輸出流,讀取輸入流的文本數據時,同步把數據寫入數組輸出流
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
while((len = is.read(b)) != -1){
bos.write(b, 0, len);
}
//把字節數組輸出流裏的數據轉換成字節數組
String text = new String(bos.toByteArray());
return text;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}