使用GET方式向服务器端提交数据
步骤:
1、把需要提交的参数组拼到URL地址的后面:http://192.168.22.136:8080/web/servlet/LoginServlet?username=123&password=1233
可以先用网页GET方式提交一次,用HttpWatch软件监视浏览器提交的内容,就可以看到详细的GET内容,
同样,POST方式提交的时候也可以得到POST提交时的内容
缺点:1、提交数据的长度有限制:
最大长度4kb,windows中提交数据时最大长度为1kb;
2、不安全
优点:代码简单
代码:
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import com.itheima.htmlview.utils.StreamTools;
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 et_qq;
private EditText et_pwd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_qq = (EditText) findViewById(R.id.et_qq);
et_pwd = (EditText) findViewById(R.id.et_pwd);
}
public void login(View view){
final String qq = et_qq.getText().toString().trim();
final String pwd = et_pwd.getText().toString().trim();
if(TextUtils.isEmpty(qq) || TextUtils.isEmpty(pwd)){
Toast.makeText(this, "qq和密码不能空", 0).show();
return;
}else{
new Thread(){
public void run() {
try {
//组拼参数到URL后面
String path = "http://192.168.22.136:8080/web/servlet/LoginServlet?username="+qq+"&password="+pwd;
// 1、发送请求
// (1)创建一个URL对象
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// (2)设置请求头信息
conn.setRequestMethod("GET");
conn.setConnectTimeout(3000);
// 2、服务器返回数据
// (1)判断状态码:200 ok,404 没有找到资源、503、509 服务器端错误
int code = conn.getResponseCode();
if(code == 200){
// (2)解析服务器返回的二进制数据,解析成一个字符串
InputStream is = conn.getInputStream();
String result = StreamTools.readStream(is);
System.out.println("---------"+ result);
}
} catch (Exception e) {
e.printStackTrace();
}
};
}.start();
}
}
}
public class StreamTools {
/**
* 把输入流转换成一个字符串
* @param is
* @return
*/
public static String readStream(InputStream is){
try {
byte[] buffer = new byte[1024];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
StringBuilder sb = new StringBuilder();
int len = -1;
while((len = is.read(buffer)) != -1){
baos.write(buffer, 0, len);
}
return baos.toString();
} catch (Exception e) {
return "";
}
}
}
使用POST方式提交数据(重点)
业务场景:
1、用户登录2、文件上传
步骤:
1、设置请求头信息POST、Content-Length:conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
//必须添加的两个请求头信息
conn.setRequestProperty("Content-Length", data.length()+"");
conn.setRequestMethod("POST");
2、设置把数据提交到服务器端:
conn.setDoOutput(true);
//把数据写到服务器端
conn.getOutputStream().write(data.getBytes());
缺点:
1、代码复杂
优点:
1、安全;
2、提交大量的数据
代码:
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import com.itheima.htmlview.utils.StreamTools;
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 et_qq;
private EditText et_pwd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_qq = (EditText) findViewById(R.id.et_qq);
et_pwd = (EditText) findViewById(R.id.et_pwd);
}
public void login(View view){
final String qq = et_qq.getText().toString().trim();
final String pwd = et_pwd.getText().toString().trim();
if(TextUtils.isEmpty(qq) || TextUtils.isEmpty(pwd)){
Toast.makeText(this, "qq和密码不能空", 0).show();
return;
}else{
new Thread(){
public void run() {
try {
String path = "http://192.168.22.136:8080/web/servlet/LoginServlet";
String data = "username="+qq+"&password="+pwd;
// 1、发送请求
// (1)创建一个URL对象
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// (2)设置请求头信息
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
//必须添加的两个请求头信息
conn.setRequestProperty("Content-Length", data.length()+"");
conn.setRequestMethod("POST");
conn.setConnectTimeout(3000);
//设置把数据提交到服务器端
conn.setDoOutput(true);
//把数据写到服务器端
conn.getOutputStream().write(data.getBytes());
// 2、服务器返回数据
// (1)判断状态码:200 ok,404 没有找到资源、503、509 服务器端错误
int code = conn.getResponseCode();
if(code == 200){
// (2)解析服务器返回的二进制数据,解析成一个字符串
InputStream is = conn.getInputStream();
String result = StreamTools.readStream(is);
System.out.println("---------"+ result);
}
} catch (Exception e) {
e.printStackTrace();
}
};
}.start();
}
}
}
乱码解决
使用POST方式提交数据时的中文乱码解决方法
使用客户端和服务器两边的字符集编码保持一致。
UTF-8,或者GBK要统一
使用GET方式提交数据的中文乱码的解决方法
使用URLEncoder.encode(name,"UTF-8")进行url编码:
String path = "http://192.168.22.136:8080/web/servlet/LoginServlet?username="+URLEncoder.encode(name,"UTF-8")+"&password="+URLEncoder.encode(pwd,"UTF-8");
使用客户端和服务器两边的字符集编码保持一致。
UTF-8,或者GBK要统一
使用GET方式提交数据的中文乱码的解决方法
使用URLEncoder.encode(name,"UTF-8")进行url编码:
String path = "http://192.168.22.136:8080/web/servlet/LoginServlet?username="+URLEncoder.encode(name,"UTF-8")+"&password="+URLEncoder.encode(pwd,"UTF-8");