GET请求和POST请求的区别:
①GET:将提交的参数拼接在URL后面,如:http://www.baidu.com/index.jsp?name=abc&pasword=123
不适合比较隐私的参数,并且参数大小一般限制为小于1KB,不适合上传文件。
②POST:将参数放在消息体内,将其发送到服务器。 大小没有限制,对于隐私的内容比较合适。
① HttpURLConnection——GET请求:
一、创建子线程调用Service类中获取服务器返回数据的方法,判断服务器返回信息,根据返回信息执行相应操作,更新UI通过runOnUiThread() UI线程操作。
package com.example.mjon.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private EditText user_name;
private EditText user_phone;
private String name;
private String phone;
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
user_name = (EditText)findViewById(R.id.user_name);
user_phone = (EditText)findViewById(R.id.user_phone);
btn = (Button)findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
name = user_name.getText().toString();
phone = user_phone.getText().toString();
new Thread(){ //创建子线程
@Override
public void run(){
final String result = Service.getInternetResult(name,phone); //调用Service类中获取服务器返回数据的方法并传递参数
if(result != null){ //如果服务器返回的信息不为空
runOnUiThread(new Runnable(){ //使用UI线程执行UI操作
@Override
public void run(){
Toast.makeText(MainActivity.this,result,Toast.LENGTH_LONG).show();
}
});
}
}
}.start(); //启动子线程
}
});
}
}
二、创建Service类,包含两个方法:返回服务器返回数据,访问服务器操作。
package com.example.mjon.myapplication;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
public class Service {
public static final String path= "http://10.0.2.2:8080/del/ServletForAndroid"; //访问服务器路径
public static String getInternetResult(String name, Stringphone){ //创建获取服务器返回数据的方法
Map<String, String> params =new HashMap<String, String>(); //创建哈希表,用于保存传递过来的参数
try{
params.put("name",name);
params.put("phone",phone);
return sendGetRequest(path, params, "UTF-8"); //调用访问服务器的方法,并传递三个参数(服务器路径,用户数据,编码格式)
}catch(Exception e){
e.printStackTrace();
}
return "提交失败!";
}
private static String sendGetRequest(String path, Map<String, String> params, String encoding) throws Exception{ //创建访问服务器的方法
StringBuilder sb = new StringBuilder(path); //实例化StringBuilder对象,存放路径
//设置连接服务器携带的参数
sb.append("?");
for(Map.Entry<String, String>entry : params.entrySet()){
sb.append(entry.getKey()).append("="); //追加键值名和等号
sb.append(URLEncoder.encode(entry.getValue(), encoding)); //追加值并进行中文字符编码,避免传递到服务器出现乱码
sb.append("&"); //连接参数
}
sb.deleteCharAt(sb.length() - 1); //删除最后一个&
URL url = new URL(sb.toString()); //创建URL保存服务器路径
HttpURLConnection httpURLConnection =(HttpURLConnection)url.openConnection();//根据URL发送HTTP请求,将返回的数据信息强转并保存在HttpURLConnection中
httpURLConnection.setConnectTimeout(5000); //设置连接超时
httpURLConnection.setRequestMethod("GET"); //设置请求方式
if(httpURLConnection.getResponseCode()== 200){ //获取服务器返回的响应请求码,若等于200则说明请求和响应皆成功
InputStream inputStream =httpURLConnection.getInputStream(); //通过HttpURLConnection去获取数据,返回一个InputStream对象
String text = StreamToString.readInputStream(inputStream); //调用SteamToString类,将字节流转换为字符串
return text; //返回数据
}
return "连接失败!";
}
}
三、创建StreamToString类,包含readInputStream方法,将字节流数据转换为字符串。
package com.example.mjon.myapplication;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class StreamToString {
public static String readInputStream(InputStream inputStream) throws IOException { //创建字节流数据转字符串方法
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); //创建缓冲区对象
int len= 0; //每次读取字节的长度
byte[]buffer = new byte[1024]; //创建缓冲区,用于存放数据
while ((len= inputStream.read(buffer)) != -1) { //判断是否读到文件末尾
outputStream.write(buffer, 0, len); //通过缓冲区对象循环读取缓冲区中的数据
}
inputStream.close(); //关闭流
outputStream.close();
byte[] result = outputStream.toByteArray(); //将缓冲区对象中的数据一次性保存到字节数组中
String temp = new String(result); //解析result中的字符串
return temp; //返回数据
}
}
四、访问网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
[五]、创建Tomcat服务器和Servlet。
1.到https://tomcat.apache.org/下载Tomcat服务器,版本根据JDK版本做选择。
2.在Eclipse中New一个Server,选择相应版本的Tomcat服务器。
3.新建Dynamic Web Project,在Java Resources/src/com.Servlet/... 下新建Servlet。
packagecom.servlet;importjava.io.IOException;
importjavax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
/**
* Servlet implementation classServletForAndroid
*/
@WebServlet("/ServletForAndroid")
public classServletForAndroid extends HttpServlet {
private static final longserialVersionUID = 1L;
/**
*@see HttpServlet#HttpServlet()
*/
public ServletForAndroid() {
super();
// TODO Auto-generatedconstructor stub
}
/**
*@see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequestrequest, HttpServletResponse response)
throws ServletException,IOException {
// TODO Auto-generated methodstub
String name =request.getParameter("name");
String phone =request.getParameter("phone");
System.out.println(name);
System.out.println(phone);
if (name != null) {
response.getOutputStream().write((name+ "登陆成功!").getBytes("UTF-8"));
}
}
/**
*@see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequestrequest, HttpServletResponse response)
throws ServletException,IOException {
// TODO Auto-generated methodstub
request.setCharacterEncoding("UTF-8");
doGet(request, response);
}
}
访问服务器路径为:http://服务器IP地址:8080/动态Web项目名/Servlet名
使用模拟器访问本机服务器时,不能写localhost,因为模拟器是一个单独的手机系统。
② HttpURLConnection——POST请求:
一、创建子线程调用Service类中获取服务器返回数据的方法,判断服务器返回信息,根据返回信息执行相应操作,更新UI通过runOnUiThread() UI线程操作。
二、创建Service类,包含两个方法:返回服务器返回数据,访问服务器操作。
package com.example.mjon.myapplication;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
public class Service {
private static final String path= "http://10.0.2.2:8080/del/ServletForAndroid"; //服务器路径
//创建获取服务器返回数据的方法
public static String getInternetResult(String name, Stringphone) {
Map<String, String> params = new HashMap<String, String>(); //创建哈希表,用于保存用于传递过来的参数
try {
params.put("name", name);
params.put("phone", phone);
return sendPostRequest(path, params, "UTF-8"); //调用访问服务器的方法,并传递三个参数(服务器路径,用户输入的数据,编码格式)
} catch(Exception e) {
e.printStackTrace();
}
return "提交失败!";
}
//创建访问服务器的方法
public static String sendPostRequest(String path, Map<String, String> params, String encoding) throws Exception{
StringBuilder sb = new StringBuilder(); //实例化StringBuilder对象
if (params!= null && !params.isEmpty()) { //判断传递过来的params是否为空
for (Map.Entry<String, String>entry : params.entrySet()) {
sb.append(entry.getKey()).append("="); //追加键值名和等号
sb.append(URLEncoder.encode(entry.getValue(), encoding)); //追加键值
sb.append("&"); //连接参数
}
sb.deleteCharAt(sb.length() -1); //删除最后一个&
}
byte[]entity = sb.toString().getBytes(); //生成实体数据
URL url = new URL(path); //创建URL,保存服务器路径
HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection(); //通过URL发送HTTP请求,将返回的数据信息保存到HttpURLConnection中
httpURLConnection.setReadTimeout(5000); //设置连接超时
httpURLConnection.setRequestMethod("POST"); //设置请求方式
httpURLConnection.setDoOutput(true); //允许对外输出数据,将实体数据写给服务器
httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); //设置请求头
httpURLConnection.setRequestProperty("Content-Length", String.valueOf(entity.length));
OutputStream outputStream =httpURLConnection.getOutputStream(); //通过HttpURLConnection获取输出流对象
outputStream.write(entity); //将实体数据写到输出流
if (httpURLConnection.getResponseCode()== 200) { //获取服务器返回的响应请求码,若等于200说明响应和请求都成功
InputStream inputStream =httpURLConnection.getInputStream(); //通过HttpURLConnection去获取数据,返回字节型输入流对象
String text = StreamToString.readInputStream(inputStream); //调用StreamToString类,传递字节流对象,将字节流数据转换为字符串
return text; //返回数据
}
return "连接失败!";
}
}
三、创建StreamToString类,包含readInputStream方法,将字节流数据转换为字符串。
四、访问网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
[五]、创建Tomcat服务器和Servlet。
1.到https://tomcat.apache.org/下载Tomcat服务器,版本根据JDK版本做选择。
2.在Eclipse中New一个Server,选择相应版本的Tomcat服务器。
3.新建Dynamic Web Project,在Java Resources/src/com.Servlet/... 下新建Servlet。
package com.servlet;
importjava.io.IOException;
importjavax.servlet.ServletException;
importjavax.servlet.annotation.WebServlet;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
/**
* Servlet implementation classServletForAndroid
*/
@WebServlet("/ServletForAndroid")
public classServletForAndroid extends HttpServlet {
private static final longserialVersionUID = 1L;
/**
*@see HttpServlet#HttpServlet()
*/
public ServletForAndroid() {
super();
// TODO Auto-generatedconstructor stub
}
/**
*@see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequestrequest, HttpServletResponse response)
throws ServletException,IOException {
// TODO Auto-generated methodstub
String name =request.getParameter("name");
String phone =request.getParameter("phone");
System.out.println(name);
System.out.println(phone);
if (name != null) {
response.getOutputStream().write((name+ "登陆成功!").getBytes("UTF-8"));
}
}
/**
*@see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequestrequest, HttpServletResponse response)
throws ServletException,IOException {
// TODO Auto-generated methodstub
request.setCharacterEncoding("UTF-8");
doGet(request, response);
}
}
③ HttpClient——GET请求:
一、创建子线程调用Service类中获取服务器返回数据的方法,判断服务器返回信息,根据返回信息执行相应操作,更新UI通过runOnUiThread() UI线程操作。
二、创建Service类,包含两个方法:返回服务器返回数据,访问服务器操作。
package com.example.mjon.myapplication;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Service {
private static final String path= "http://10.0.2.2:8080/del/ServletForAndroid"; //服务器路径
//创建获取服务器返回数据的方法
public static String getInternetResult(String name, Stringphone) {
Map<String, String> params = new HashMap<String, String>(); //创建哈希表,用于保存传递过来的参数
try {
params.put("name", name);
params.put("phone", phone);
return sendGetRequest(path, params); //调用访问服务器的方法并传递参数(服务器路径,用户数据)
} catch(Exception e) {
e.printStackTrace();
}
return "提交失败";
}
//创建访问服务器的方法
public static String sendGetRequest(String path, Map<String, String> map_params) throwsException {
//定义简单名称 值对 节点类型,用于存储要传送的参数
List<NameValuePair> params = new ArrayList<NameValuePair>();
for (Map.Entry<String, String>entry : map_params.entrySet()) {
params.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
}
String param = URLEncodedUtils.format(params, "UTF-8"); //对参数进行字符编码
HttpGet httpGet = new HttpGet(path+ "?" + param); //创建请求对象,拼装路径,传递服务器路径
HttpClient httpClient = new DefaultHttpClient(); //实例化DefaultHttpClient对象,保存到HttpClient接口中
try {
HttpResponse response =httpClient.execute(httpGet); //通过接口去执行请求模式操作,服务器返回一个Response(保存返回的所有数据),创建HttpResponse接收
if (response.getStatusLine().getStatusCode() == 200) { //取出服务器状态码,若等于200说明请求和响应皆成功
return EntityUtils.toString(response.getEntity(), "UTF-8"); //获取服务器响应内容
}
} catch (IOExceptione) {
e.printStackTrace();
} catch(Exception e) {
e.printStackTrace();
}
return "连接失败";
}
}
三、访问网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
[四]、创建Tomcat服务器和Servlet。
1.到https://tomcat.apache.org/下载Tomcat服务器,版本根据JDK版本做选择。
2.在Eclipse中New一个Server,选择相应版本的Tomcat服务器。
3.新建Dynamic Web Project,在Java Resources/src/com.Servlet/... 下新建Servlet。
packagecom.servlet;
importjava.io.IOException;
importjavax.servlet.ServletException;
importjavax.servlet.annotation.WebServlet;
importjavax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
/**
* Servlet implementation classServletForAndroid
*/
@WebServlet("/ServletForAndroid")
public classServletForAndroid extends HttpServlet {
private static final long serialVersionUID= 1L;
/**
*@see HttpServlet#HttpServlet()
*/
public ServletForAndroid() {
super();
// TODO Auto-generatedconstructor stub
}
/**
*@see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequestrequest, HttpServletResponse response)
throws ServletException,IOException {
// TODO Auto-generated methodstub
String name =request.getParameter("name");
String phone =request.getParameter("phone");
System.out.println(name);
System.out.println(phone);
if (name != null) {
response.getOutputStream().write((name+ "登陆成功!").getBytes("UTF-8"));
}
}
/**
*@see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequestrequest, HttpServletResponse response)
throws ServletException,IOException {
// TODO Auto-generated methodstub
request.setCharacterEncoding("UTF-8");
doGet(request, response);
}
}
④ HttpClient——POST请求:
一、创建子线程调用Service类中获取服务器返回数据的方法,判断服务器返回信息,根据返回信息执行相应操作,更新UI通过runOnUiThread() UI线程操作。
二、创建Service类,包含两个方法:返回服务器返回数据,访问服务器操作。
package com.example.mjon.myapplication;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Service {
private static final String path= "http://10.0.2.2:8080/del/ServletForAndroid"; //服务器路径
//创建获取服务器数据的方法
public static String getInternetResult(String name, Stringphone) {
Map<String, String> params = new HashMap<String, String>(); //创建哈希表,保存用户数据
try {
params.put("name", name);
params.put("phone", phone);
return sendPostRequest(path, params); //调用访问服务器方法,传递参数(服务器路径,用户数据)
} catch(Exception e) {
e.printStackTrace();
}
return "提交失败";
}
//创建访问服务器方法
public static String sendPostRequest(String path, Map<String, String> map_params) {
List<NameValuePair> params= new ArrayList<NameValuePair>(); //创建简单名称 值对节点类型,存储要传递的参数
for (Map.Entry<String, String> entry : map_params.entrySet()) {
params.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
}
try {
UrlEncodedFormEntityencodedFormEntity = new UrlEncodedFormEntity(params, "UTF-8"); //对参数进行编码
HttpClient httpClient = new DefaultHttpClient(); //实例化DefaultHttpClient对象,保存到HttpClient接口中
HttpPost httpPost = new HttpPost(path); //创建请求方式,存储服务器路径
httpPost.setEntity(encodedFormEntity); //将参数添加到HttpPost中
HttpResponse httpResponse =httpClient.execute(httpPost); //通过接口去执行请求模式操作,服务器返回一个Response(保存返回的所有数据)对象,创建HttpResponse对象接收
if (httpResponse.getStatusLine().getStatusCode() == 200) { //取出服务器返回的响应请求码,若等于200说明响应和请求都成功
return EntityUtils.toString(httpResponse.getEntity(), "UTF-8"); //获取服务器响应内容,编码,返回
}
} catch (Exceptione) {
e.printStackTrace();
}
return "连接失败";
}
}
三、访问网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
[四]、创建Tomcat服务器和Servlet。
1.到https://tomcat.apache.org/下载Tomcat服务器,版本根据JDK版本做选择。
2.在Eclipse中New一个Server,选择相应版本的Tomcat服务器。
3.新建Dynamic Web Project,在Java Resources/src/com.Servlet/... 下新建Servlet。