Android数据提交方式之HttpURLConnection与HttpClient的Get和Post

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。

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);
        }
 
}

猜你喜欢

转载自blog.csdn.net/march0000/article/details/80151586