使用GET方式向服务器端提交数据
* 原理:把要提交的数据组拼到Url后面
* http协议规定数据长度不超过4kb,IE浏览器超过1kb就会丢弃掉后面的数据
* 缺点:数据不安全
* 优点:代码书写简单
示例代码:
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
private EditText etPwd;
private EditText etQQ;
private String pwd;
private String qq;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etPwd = (EditText) findViewById(R.id.et_pwd);
etQQ = (EditText) findViewById(R.id.et_qq);
}
/**
* 1. 在子线程中进行网络通讯 2. 获取服务器返回的信息 3. 用Handler去展示服务器返回的信息
*/
public void login(View v) {
pwd = etPwd.getText().toString().trim();
qq = etQQ.getText().toString().trim();
if (TextUtils.isEmpty(pwd) || TextUtils.isEmpty(qq)) {
Toast.makeText(this, "亲,请输入QQ号码或者密码! :) ", 0).show();
return;
}
// 开启子线程
new Thread() {
public void run() {
requestNetWork();
};
}.start();
}
/**
* 网络通信
*/
private void requestNetWork() {
//Servlet
try {
String path = "http://192.168.25.70:8080/web/LoginServlet?" + "qq="
+ URLEncoder.encode(qq) + "&pwd=" + URLEncoder.encode(pwd, "utf-8");
// 1. 创建Url
URL url = new URL(path);
// 2. 用Url打开连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 3. 设置请求参
conn.setRequestMethod("GET");
conn.setConnectTimeout(3000);
conn.setReadTimeout(3000);
// 4. 获取响应状态码
int code = conn.getResponseCode();
if (code == 200) {
// * 2xxx 请求成 3xxx重定向 4xxx资源错误 5xxx服务器错误
// 5. 获取服务器返回的二进制输入流
InputStream is = conn.getInputStream();
// 把流转成字符串
String text = StringUtils.parseStream2String(is);
showToast(text);
} else {
showToast(code + "");
}
} catch (Exception e) {
e.printStackTrace();
showToast("服务器忙!");
}
}
/**
* 在任意线程弹土司
*/
public void showToast(final String text) {
this.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, text, 0).show();
}
});
}
}
使用POST方式向服务器端提交数据
* 原理:通过form表单提交数据
* 缺点:代码书写复杂
* 优点:数据安全
示例代码:
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
private EditText etPwd;
private EditText etQQ;
private String pwd;
private String qq;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etPwd = (EditText) findViewById(R.id.et_pwd);
etQQ = (EditText) findViewById(R.id.et_qq);
}
/**
* 1. 在子线程中进行网络通讯
* 2. 获取服务器返回的信息
* 3. 用Handler去展示服务器返回的信息
*/
public void login(View v) {
pwd = etPwd.getText().toString().trim();
qq = etQQ.getText().toString().trim();
if (TextUtils.isEmpty(pwd) || TextUtils.isEmpty(qq)) {
Toast.makeText(this, "亲,请输入QQ号码或者密码! :) ", 0).show();
return;
}
// 开启子线程
new Thread() {
public void run() {
requestNetWork();
};
}.start();
}
/**
* 网络通信
*/
private void requestNetWork() {
//(1) 请求的Url不一样
String path = "http://192.168.3.100:8080/web/LoginServlet";
try {
// 1. 创建Url
URL url = new URL(path);
// 2. 用Url打开连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 3. 设置请求参数
//(2)请求的方法不一样
conn.setRequestMethod("POST");
conn.setConnectTimeout(3000);
conn.setReadTimeout(3000);
//(3)多了两个请求头
String data = "qq="+URLEncoder.encode(qq)+"&pwd="+URLEncoder.encode(pwd, "utf-8");
conn.setRequestProperty("Content-Length", String.valueOf(data.length()));
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
//(4)以二进制流的方式把数据提交给服务器
//重要,声明要给服务器提交数据
conn.setDoOutput(true);
conn.getOutputStream().write(data.getBytes());
// 4. 获取响应状态码
int code = conn.getResponseCode();
if (code == 200) {
// * 2xxx 请求成 3xxx重定向 4xxx资源错误 5xxx服务器错误
// 5. 获取服务器返回的二进制输入流
InputStream is = conn.getInputStream();
// 把流转成字符串
String text = StringUtils.parseStream2String(is);
showToast(text);
} else {
showToast(code + "");
}
} catch (Exception e) {
e.printStackTrace();
showToast("服务器忙!");
}
}
/*
* 在任意线程弹土司
*/
public void showToast(final String text) {
this.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, text, 0).show();
}
});
}
}
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
/**
* 操作字符串
*/
public class StringUtils {
/**
* 从流中转成字符串
* @param is
* 输入流
* @return null表示失败
*/
public static String parseStream2Str(InputStream is) {
//内存输出流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int len = -1;
byte[] buffer = new byte[1024*8];
try {
while((len = is.read(buffer)) != -1){
baos.write(buffer, 0, len);
}
return new String(baos.toByteArray());
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
Get和post的请求的区别:
URL不一样
提交的数据方式不一样
Post多了二个请求头: ContentLength 和 ContentType
Post用二进制输出提交数据