详解Android:向服务器提供数据之get、post方式

在这我们首先了解Android客户端向服务器提交数据的底层做法。get、post两种方法提交数据,下面我们用示例了解get以及post方式。

需要在布局文件中增加两个个EditText控件和两个登录的Button控件。其中一个Button是使用get方式提交数据,一个是使用post提交数据。

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/et_main_name"
    android:hint="请输入用户名"
    />
  <EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/et_main_pwd"
    android:hint="请输入用户名"
    />
  <Button
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
    android:text="登录GET"
    android:onClick="getdata"
  />
  <Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="登录POST"
    android:onClick="postdata"
    />

一、使用get方式提交数据

需要写一个异步任务类继承AsyncTask,重写它的两个方法。代码如下:

public class MainActivity extends AppCompatActivity { 

  private EditText et_main_name;
  private EditText et_main_pwd;
  private HttpURLConnection httpURLConnection;
  private URL url; 

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    et_main_name = (EditText) findViewById(R.id.et_main_name);
    et_main_pwd = (EditText) findViewById(R.id.et_main_pwd);
  }
  //获取GET提交数据的点击事件
  public void getdata(View view){
    String name=et_main_name.getText().toString();
    String pwds=et_main_pwd.getText().toString();
    String path="http://192.168.43.143:8080/login/login.xhtml";
    new myTask().execute(name,pwds,path,"GET"); 

  }
  //写一个异步任务类继承AsyncTask,重写它的两个方法
  class myTask extends AsyncTask{
    @Override
    protected Object doInBackground(Object[] params) {
      //获取参数的值
      String name = params[0].toString();
      String pwds = params[1].toString();
      String path = params[2].toString();
      String type = params[3].toString();
      String s = "uname=" + name + "&pwd=" + pwds; 

      //判断提交数据的类型1、get 2、post
      try {
        if ("GET".equals(type)) {//用get方式提交
          path = path + "?" + s;
          url = new URL(path);
          httpURLConnection = (HttpURLConnection) url.openConnection();
          httpURLConnection.setRequestMethod("GET");
        } else if ("POST".equals(type)) {//用post方式提交 

        }
        httpURLConnection.setConnectTimeout(5000);
      if (httpURLConnection.getResponseCode() == 200) {
        InputStream inputStream = httpURLConnection.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String result = bufferedReader.readLine();
        return result;
      }
    } catch (MalformedURLException e) {
          e.printStackTrace();
      }catch (ProtocolException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
      return null;
    }
    @Override
    protected void onPostExecute(Object o) {
      String str= (String) o;
      Toast.makeText(MainActivity.this,str,Toast.LENGTH_SHORT).show();
      super.onPostExecute(o);
    }
  }
}

二、使用post方式提交数据

post和get一样需要写一个异步任务类继承AsyncTask,重写它的两个方法。但是post需要设置Content-Length、Content-Type以及对外输出数据。而且请求的路径不同,post相对于比get安全。代码如下:

public class MainActivity extends AppCompatActivity { 

  private EditText et_main_name;
  private EditText et_main_pwd;
  private HttpURLConnection httpURLConnection;
  private URL url; 

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    et_main_name = (EditText) findViewById(R.id.et_main_name);
    et_main_pwd = (EditText) findViewById(R.id.et_main_pwd);
  } 

  //获取POST提交数据的点击事件
  public void postdata(View view){
    String name=et_main_name.getText().toString();
    String pwds=et_main_pwd.getText().toString();
    String path="http://192.168.43.143:8080/login/login.xhtml";
    new myTask().execute(name,pwds,path,"POST"); 

  } 

  //写一个异步任务类继承AsyncTask,重写它的两个方法
  class myTask extends AsyncTask{
    @Override
    protected Object doInBackground(Object[] params) {
      //获取参数的值
      String name = params[0].toString();
      String pwds = params[1].toString();
      String path = params[2].toString();
      String type = params[3].toString();
      String s = "uname=" + name + "&pwd=" + pwds; 

      //判断提交数据的类型1、get 2、post
      try {
        if ("GET".equals(type)) {//用get方式提交 

        } else if ("POST".equals(type)) {//用post方式提交
          url = new URL(path);//得到请求的路径
          httpURLConnection = (HttpURLConnection) url.openConnection();
          //设置Content-Length Content-Type
          httpURLConnection.setRequestProperty("Content-Length", s.length() + "");
          httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
          //设置允许对外输出数据
          httpURLConnection.setDoOutput(true);
          //将用户名密码以流的形式对外输出
          httpURLConnection.getOutputStream().write(s.getBytes());
          httpURLConnection.setRequestMethod("POST");//数据提交的类型
        }
        httpURLConnection.setConnectTimeout(5000);
      if (httpURLConnection.getResponseCode() == 200) {//判断响应码
        InputStream inputStream = httpURLConnection.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String result = bufferedReader.readLine();
        return result;
      }
    } catch (MalformedURLException e) {
          e.printStackTrace();
      }catch (ProtocolException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
      return null;
    }
    @Override
    protected void onPostExecute(Object o) {
      String str= (String) o;
      Toast.makeText(MainActivity.this,str,Toast.LENGTH_SHORT).show();
      super.onPostExecute(o);
    }
  }
}

另外,需要增加网络权限:

<uses-permission android:name="android.permission.INTERNET" /> 

三、总结

1、get方式与post方式请求的路径(URL地址)不同。

2、post方式需要对请求头的设置。

//设置Content-Length Content-Type
httpURLConnection.setRequestProperty("Content-Length", s.length() + "");
httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 

3、post方式需要请求内容,而get方式的相应内容在URL地址中。

4、post方式与get方式的请求时所携带的内容大小不同。

get:1k。

post:理论上是无限制的,相对于而言post适合传大量数据。

5、get方式的数据直接显示在URL地址中,这是不安全的;而post方式不会,安全性相对于比较高。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android中使用HttpURLConnection实现GET POST JSON数据与下载图片

    Android6.0中把Apache HTTP Client所有的包与类都标记为deprecated不再建议使用所有跟HTTP相关的数据请求与提交操作都通过HttpURLConnection类实现,现实是很多Android开发者一直都Apache HTTP Client来做andoird客户端与后台HTTP接口数据交互,小编刚刚用HttpURLConnection做了一个android的APP,不小心踩到了几个坑,总结下最常用的就通过HttpURLConnection来POST提交JSON数据与

  • Android中使用OkHttp包处理HTTP的get和post请求的方法

    概览 http是现在主流应用使用的网络请求方式, 用来交换数据和内容, 有效的使用HTTP可以使你的APP 变的更快和减少流量的使用 OkHttp 是一个很棒HTTP客户端(GitHub主页:https://github.com/square/okhttp): 支持SPDY, 可以合并多个到同一个主机的请求 使用连接池技术减少请求的延迟(如果SPDY是可用的话) 使用GZIP压缩减少传输的数据量 缓存响应避免重复的网络请求 当你的网络出现拥挤的时候,就是OKHttp 大显身手的时候, 它可以避免

  • Android下通过httpClient发送GET和POST请求的实例代码

    复制代码 代码如下: public class HttpUtil { public static String sendDataByHttpClientGet(String path,String name,String pass){        String result = "";        //1.获取到一个浏览器        HttpClient client = new DefaultHttpClient();        //2.准备请求的地址        tr

  • android使用url connection示例(get和post数据获取返回数据)

    一定要加上对Sd卡读写文件的权限声明,以及访问网络的权限 复制代码 代码如下: <uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="androi

  • android之HttpPost&HttpGet使用方法介绍

    直接讲用法,先知道怎么用,再知道怎么回事 1.HttpPost 复制代码 代码如下: try{ //创建连接 HttpClient httpClient = new DefaultHttpClient(); HttpPost post = new HttpPost(url); //设置参数,仿html表单提交 List<NameValuePair> paramList = new ArrayList<NameValuePair>(); BasicNameValuePair para

  • android平台HttpGet、HttpPost请求实例

    使用HttpClient中的HttpGet()方法进行http通信的实例: 复制代码 代码如下: /**   *description:Android HttpGet()   *authour:YanEr·Gates   *website:http://www.jb51.net */ package me.gogogoog; import java.io.IOException; import org.apache.http.HttpResponse;import org.apache.http

  • Android HttpClient GET或者POST请求基本使用方法

    在Android开发中我们经常会用到网络连接功能与服务器进行数据的交互,为此Android的SDK提供了Apache的HttpClient来方便我们使用各种Http服务.你可以把HttpClient想象成一个浏览器,通过它的API我们可以很方便的发出GET,POST请求(当然它的功能远不止这些) 这里只介绍如何使用HttpClient发起GET或者POST请求 GET 方式 复制代码 代码如下: //先将参数放入List,再对参数进行URL编码 List<BasicNameValuePair>

  • Android发送GET与POST请求的DEMO详解

    4.0后网络访问必须单独起一个子线程访问,否则无法运行,这里有一个发送请求的工具类GetPostUtil 复制代码 代码如下: public class GetPostUtil{ /**  * 向指定URL发送GET方法的请求  *   * @param url  *            发送请求的URL  * @param params  *            请求参数,请求参数应该是name1=value1&name2=value2的形式.  * @return URL所代表远程资源的

  • android AsynTask处理返回数据和AsynTask使用get,post请求

    Android是一个单线程模型,Android界面(UI)的绘制都只能在主线程中进行,如果在主线程中进行耗时的操作,就会影响UI的绘制和事件的响应.所以在android规定,不可在主线中进行耗时操作,否则将发生程序无响应(ANR)问题. 解决办法:开启新的线程进行耗时操作 开启新的线程可以new Thread() 或实现Runnable接口 什么要使用AsyncTask呢? 如果是使用Thread的run()方法,run()结束之后没有返回值.所以必须要自己建立通信机制 AsyncTask将所有

  • Android中post和get的提交方式【三种】

    向服务器提交数据有两种方式,post和get.两者的区别主要有三点,安全性.长度限制.数据结构.其中get请求安全性相比较而言较差,数据长度受浏览器地址栏限制,没有方法体.两种都是较为重要的数据提交方式.现简单介绍一下三种post和get的提交方式.无论是哪种方法实现post和get,get 的访问路径都要携带数据,而post提交是把数据放在方法体中. 普通方法实现get/post提交:    严格遵照Http协议进行数据传输.在安卓开发环境下,由于主线程不能进行网络访问,因此需要在开启一个子线

随机推荐