【声明】 

迎接转发,但请保留小说原来出处→_→ 

生命壹号:http://www.cnblogs.com/smyhvae/

文章来源:http://www.cnblogs.com/smyhvae/p/4006009.html

 

【系列】Android连串之网络:(持续立异)

Android连串之互连网(一)—-使用HttpClient发送HTTP请求(通过get方法获取数据)

Android体系之互连网(二)—-HTTP请求头与响应头

Android体系之网络(三)—-使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)

Android连串之互连网(四)—-SAX格局解析XML数据

 

【正文】

在前两篇小说中,大家学习到了和HTTP相关的基础知识。小说链接如下:

Android系列之互联网(一)—-使用HttpClient发送HTTP请求(通过get方法获取数据)

Android体系之网络(二)—-HTTP请求头与响应头

一、GET和POST的对比:

在漫漫的光阴当中,其余的法门渐渐的脱离了历史舞台,最常用的只剩下GET和POST方法。而此前早已讲过了经过GET方法获取数据,今天来学习一下怎么着分别通过GET和POST获取数据。

举个例子:get类似于明信片,唯有请求头,没有请求体。而post类似于一封信,信封上的始末为请求头;信里面的内容为请求体(请求头和请求体是分开的)。

意义如下:

  • GET:通过请求URI得到资源。一般用来获取/查询资源新闻。
  • POST:用于向服务器交由新的情节。一般用于更新资源音讯。

重在不同如下:

  • XML,GET方法主要用来从服务器取回数据,POST用于向服务器交由数据
  • get类似于明信片,只有请求头,没有请求体;post类似于一封信,信封上的故事情节为请求头;信里面的情节为请求体
  • 选取GET方法啊向服务器i教的数据量较小,平日不当先2K,使用POST向服务器交由的数据量平常没有范围(明信片无法多写,而上书可以写过多故事情节呢)
  • GET请求是将所要提交的多少附在URL之后,而POST请求是将付出的多寡放置在请求体当中

锤子科技(science and technology)董事长锤子科学技术创办者罗永浩在将到get和post请求的时候, 是那样说的:

  • 1、GET是从服务器上获取数据,POST是向服务器传送数据。
  • 2、在客户端,
    GET格局在经过URL提交数据,数据在URL中得以看出;POST形式,数据放置在HTML
    HEADER内提交
  • 3、对于GET情势,服务器端用Request.QueryString获取变量的值,对于POST方式,服务器端用Request.Form获取提交的数目。
  • 4、GET格局交给的多少最三只可以有1024字节,而POST则尚未此限制
  • 5、安全性难点。正如在(2)中涉及,使用 GET 的时候,参数会显得在地点栏上,而 POST
    不会。所以,如若这一个数量是汉语数据同时是非敏感数据,那么使用 GET
    ;倘若用户输入的数码不是汉语字符而且含有敏感数据,那么照旧选拔POST为好

啰嗦了如此多,对那段来个小结吧。

 【总结】

get/post请求的差别:

  • get请求格局:显式请求方式,请求参数会在URL上浮现,相对快,安全性较低,请求数据的大大小小相似不当先1kb。
  • post请求方式:隐式请求情势,请求参数将会在http请求的实体内容中展开传输,相对慢,安全性较高
    ,请求数据的分寸没有限制

注:GET请求方式和POST请求分歧在于请求参数在传递的进程中艺术各异。

 

二、URL的概念和组合:

URL:Uniform Resource Locator 统一资源一定符

URL的组成部分:以http://www.mbalib.com/china/index.htm为例

  • http://:代表超文本传输协议
  • www:代表一个万维网服务器
  • mbalib.com/:服务器的域名,或服务器名称
  • China/:子目录,类似于大家的公文夹
  • Index.htm:是文本夹中的一个文书
  • /china/index.htm统称为URL路径

 

三、使用tomcat软件在地头搭建服务器:

有了这一个服务器,就一定于在该地的微机有了一个网站,然后大家得以经过浏览器来做客这么些网站。

tomcat软甲是apache旗下的一个开源项目。软件下载链接:http://tomcat.apache.org/

下载之后,将削减包解压:

XML 1

瞩目目录名无法有粤语和空格。

软件运行从前要保管环境变量已经布署:

XML 2

上图中,变量名为JAVA_HOME,变量值为:JDK安装的绝对路径。

回到tomcat的bin目录中, 双击startup.bat:

XML 3

然后弹出如下界面:

XML 4

其一时候,本地的服务器就早已搭建起来了。

首先查看本人电脑的ip地址,我的微处理器的ip地址为:192.168.1.112。

在浏览器中输入http://192.168.1.112:8080/。如果弹出如下界面,表示tomcat安装成功并且启动起来了:

XML 5

下面图片中,突显自身的汤姆cat的版本为:8.0.14。它的版本号是随即JDK的本子走的,所以,提出JDK的本子为1.8。

大家将来在浏览器上测试一下它吗:

首先在D:\apache-tomcat-8.0.14\webapps\ROOT目录中新建一个jsp文件:

XML 6

jsp文件中填入如下内容:

<%

String name = request.getParameter("name");

String pwd = request.getParameter("password");



out.print("name:" + name + ",password:" + pwd); //在浏览器上显示输入地址中的用户名与密码

%>

近期大家随便起一个用户名和密码的账号,比如用户名smyhvae,密码为smyh,然后在浏览器中输入如下内容:

http://192.168.1.112:8080/test.jsp?name=smyhvae&password=smyh

输入这几个链接之后,回车,出现如下界面:

XML 7

上图中象征,我们向服务器发送那样一个请求,链接中,问号前边的故事情节表示呼吁的路线,问号前边是我们要传送的参数(键是固定不变的,值是用户自个儿填写的),然后服务器返还给大家如此的数目。

 

四、使用GET方法向服务器发送数据:

咱俩在博客“Android种类之互连网(一)”中实际上就早已因而GET方法向服务器获取数据了,只可是那篇文章中是访问百度首页,然后拿走百度首页的多寡。以后大家要通过同样的GET方法,只但是是换成了得到当地服务器搭建的网站数量。

只须求有些修改一下那篇小说中的代码(代码结构同样,只是换了其它一个链接)。完整版代码如下:

activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <EditText 
        android:id="@+id/nameText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="username" />

    <EditText 
        android:id="@+id/pwdText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="password" />

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="submit" />

</LinearLayout>

MainActivity.java的代码如下:

 1 package com.example.m04_http02;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.InputStreamReader;
 5 import java.util.ArrayList;
 6 import org.apache.http.HttpEntity;
 7 import org.apache.http.HttpResponse;
 8 import org.apache.http.NameValuePair;
 9 import org.apache.http.client.HttpClient;
10 import org.apache.http.client.entity.UrlEncodedFormEntity;
11 import org.apache.http.client.methods.HttpGet;
12 import org.apache.http.client.methods.HttpPost;
13 import org.apache.http.impl.client.DefaultHttpClient;
14 import org.apache.http.message.BasicNameValuePair;
15 
16 import android.app.Activity;
17 import android.os.Bundle;
18 import android.util.Log;
19 import android.view.View;
20 import android.view.View.OnClickListener;
21 import android.widget.Button;
22 import android.widget.EditText;
23 
24 public class MainActivity extends Activity {
25 
26     private EditText nameText;
27     private EditText pwdText;
28     private Button button;
29 
30     @Override
31     protected void onCreate(Bundle savedInstanceState) {
32         super.onCreate(savedInstanceState);
33         setContentView(R.layout.activity_main);
34         nameText = (EditText) findViewById(R.id.nameText);
35         pwdText = (EditText) findViewById(R.id.pwdText);
36         button = (Button) findViewById(R.id.button1);
37 
38         button.setOnClickListener(new OnClickListener() {
39 
40             @Override
41             public void onClick(View v) {
42                 // TODO Auto-generated method stub
43                 // 用户输入用户名密码, 然后通过Get方法发送给本地服务器
44                 String name = nameText.getText().toString();
45                 String pwd = pwdText.getText().toString();
46 
47                 // 运行线程,使用GET方法向本地服务器发送数据
48                 GetThread getThread = new GetThread(name, pwd);
49                 getThread.start();
50             }
51         });
52     }
53     
54     //子线程:通过GET方法向服务器发送用户名、密码的信息
55     class GetThread extends Thread {
56 
57         String name;
58         String pwd;
59 
60         public GetThread(String name, String pwd) {
61             this.name = name;
62             this.pwd = pwd;
63         }
64 
65         @Override
66         public void run() {
67             //用HttpClient发送请求,分为五步
68             //第一步:创建HttpClient对象
69             HttpClient httpClient = new DefaultHttpClient();
70             //注意,下面这一行中,我之前把链接中的"test"误写成了"text",导致调BUG调了半天没弄出来,真是浪费时间啊
71             String url = "http://192.168.1.112:8080/test.jsp?name=" + name+ "&password=" + pwd;
72             //第二步:创建代表请求的对象,参数是访问的服务器地址
73             HttpGet httpGet = new HttpGet(url);
74             try {
75                 //第三步:执行请求,获取服务器发还的相应对象
76                 HttpResponse response = httpClient.execute(httpGet);
77                 //第四步:检查相应的状态是否正常:检查状态码的值是200表示正常
78                 if (response.getStatusLine().getStatusCode() == 200) {
79                     //第五步:从相应对象当中取出数据,放到entity当中
80                     HttpEntity entity = response.getEntity();
81                     BufferedReader reader = new BufferedReader(
82                             new InputStreamReader(entity.getContent()));
83                     String result = reader.readLine();
84                     Log.d("HTTP", "GET:" + result);
85                 }
86             } catch (Exception e) {
87                 e.printStackTrace();
88             }
89 
90         }
91     }
92 } 

上边代码中,第73行就是我们所放入的url链接。运行程序后,输入用户名密码,可以见到在后台打印出了大家所输入的用户名和密码:

XML 8

   

五、使用POST方法向服务器发送数据:

上一段中,大家是通过GET方法向服务器发送数据,将来经过POST方法向服务器发送数据。布局文件的代码不变,就不写了。MainActivity.java的代码如下:

  1 package com.example.m04_http02;
  2 
  3 import java.io.BufferedReader;
  4 import java.io.InputStreamReader;
  5 import java.util.ArrayList;
  6 
  7 import org.apache.http.HttpEntity;
  8 import org.apache.http.HttpResponse;
  9 import org.apache.http.NameValuePair;
 10 import org.apache.http.client.HttpClient;
 11 import org.apache.http.client.entity.UrlEncodedFormEntity;
 12 import org.apache.http.client.methods.HttpGet;
 13 import org.apache.http.client.methods.HttpPost;
 14 import org.apache.http.impl.client.DefaultHttpClient;
 15 import org.apache.http.message.BasicNameValuePair;
 16 
 17 import android.app.Activity;
 18 import android.os.Bundle;
 19 import android.util.Log;
 20 import android.view.View;
 21 import android.view.View.OnClickListener;
 22 import android.widget.Button;
 23 import android.widget.EditText;
 24 
 25 public class MainActivity extends Activity {
 26 
 27     private EditText nameText;
 28     private EditText pwdText;
 29     private Button button;
 30 
 31     @Override
 32     protected void onCreate(Bundle savedInstanceState) {
 33         super.onCreate(savedInstanceState);
 34         setContentView(R.layout.activity_main);
 35         nameText = (EditText) findViewById(R.id.nameText);
 36         pwdText = (EditText) findViewById(R.id.pwdText);
 37         button = (Button) findViewById(R.id.button1);
 38 
 39         button.setOnClickListener(new OnClickListener() {
 40 
 41             @Override
 42             public void onClick(View v) {
 43                 // TODO Auto-generated method stub
 44                 // 用户输入用户名密码, 然后通过Get方法发送给本地服务器
 45                 String name = nameText.getText().toString();
 46                 String pwd = pwdText.getText().toString();
 47 
 48                 // 使用GET方法向本地服务器发送数据
 49                 //GetThread getThread = new GetThread(name, pwd);
 50                 //getThread.start();                
 51                 
 52                 //使用POST方法向服务器发送数据
 53                 PostThread postThread = new PostThread(name, pwd);
 54                 postThread.start();
 55             }
 56         });
 57     }
 58 
 59 
 60     //子线程:通过GET方法向服务器发送用户名、密码的信息
 61     class GetThread extends Thread {
 62 
 63         String name;
 64         String pwd;
 65 
 66         public GetThread(String name, String pwd) {
 67             this.name = name;
 68             this.pwd = pwd;
 69         }
 70 
 71         @Override
 72         public void run() {
 73             //用HttpClient发送请求,分为五步
 74             //第一步:创建HttpClient对象
 75             HttpClient httpClient = new DefaultHttpClient();
 76             //注意,下面这一行中,我之前把链接中的"test"误写成了"text",导致调BUG调了半天没弄出来,真是浪费时间啊
 77             String url = "http://192.168.1.112:8080/test.jsp?name=" + name+ "&password=" + pwd;
 78             //第二步:创建代表请求的对象,参数是访问的服务器地址
 79             HttpGet httpGet = new HttpGet(url);
 80             try {
 81                 //第三步:执行请求,获取服务器发还的相应对象
 82                 HttpResponse response = httpClient.execute(httpGet);
 83                 //第四步:检查相应的状态是否正常:检查状态码的值是200表示正常
 84                 if (response.getStatusLine().getStatusCode() == 200) {
 85                     //第五步:从相应对象当中取出数据,放到entity当中
 86                     HttpEntity entity = response.getEntity();
 87                     BufferedReader reader = new BufferedReader(
 88                             new InputStreamReader(entity.getContent()));
 89                     String result = reader.readLine();
 90                     Log.d("HTTP", "GET:" + result);
 91                 }
 92             } catch (Exception e) {
 93                 e.printStackTrace();
 94             }
 95 
 96         }
 97     }    
 98     
 99     //子线程:使用POST方法向服务器发送用户名、密码等数据
100     class PostThread extends Thread {
101 
102         String name;
103         String pwd;
104 
105         public PostThread(String name, String pwd) {
106             this.name = name;
107             this.pwd = pwd;
108         }
109 
110         @Override
111         public void run() {
112             HttpClient httpClient = new DefaultHttpClient();
113             String url = "http://192.168.1.112:8080/test.jsp";
114             //第二步:生成使用POST方法的请求对象
115             HttpPost httpPost = new HttpPost(url);
116             //NameValuePair对象代表了一个需要发往服务器的键值对
117             NameValuePair pair1 = new BasicNameValuePair("name", name);
118             NameValuePair pair2 = new BasicNameValuePair("password", pwd);
119             //将准备好的键值对对象放置在一个List当中
120             ArrayList<NameValuePair> pairs = new ArrayList<NameValuePair>();
121             pairs.add(pair1);
122             pairs.add(pair2);
123             try {
124                 //创建代表请求体的对象(注意,是请求体)
125                 HttpEntity requestEntity = new UrlEncodedFormEntity(pairs);
126                 //将请求体放置在请求对象当中
127                 httpPost.setEntity(requestEntity);
128                 //执行请求对象
129                 try {
130                     //第三步:执行请求对象,获取服务器发还的相应对象
131                     HttpResponse response = httpClient.execute(httpPost);
132                     //第四步:检查相应的状态是否正常:检查状态码的值是200表示正常
133                     if (response.getStatusLine().getStatusCode() == 200) {
134                         //第五步:从相应对象当中取出数据,放到entity当中
135                         HttpEntity entity = response.getEntity();
136                         BufferedReader reader = new BufferedReader(
137                                 new InputStreamReader(entity.getContent()));
138                         String result = reader.readLine();
139                         Log.d("HTTP", "POST:" + result);
140                     }
141                 } catch (Exception e) {
142                     e.printStackTrace();
143                 }
144             } catch (Exception e) {
145                 e.printStackTrace();
146             }
147         }
148     }
149     
150     
151 }

上面代码中,大家新开一个子线程,使用POST方法向服务器发送用户名、密码等数据。我们事先早已明白,使用GET方法发送HTTP请求有五大步子,目前天换成POST方法时,须要在第二步和第三步之间投入一些手续(即上方加粗部分的代码:116-127行),多的步调其实是往请求对象中参与请求体。将来来详细解释一下这有的代码:

大家通过NameValuePair集合来存放待提交的参数,并将以此参数集合传入到一个UrlEncodedFormEntity当中(这些类的目的就意味着了一个请求体,即键值对),然后将请求体放置在哀告对象httpPost当中。

程序运行后,输入用户名和密码,点击按钮,在后台打印出了事先输入的用户名密码:

XML 9

当今大家计算一下POST提交数据的手续:

    1. 协会请求对象;
    1. 将急需传递给劳务器端的数据放置在键值对目的当中;
    1. 将准备好的键值对停放在List当中;
    1. 变动代表请求体的对象;
    1. 将存有请求键值对的List对象放置在请求题对象当中;
    1. 将请求体对象放置到请求对象当中;
    1. 出殡请求对象
  • 末尾的手续(即拍卖请求对象)和GET方法是千篇一律的。

地点两段的事例,都是透过GET和POST往服务器发送数据(在此,二者的出力是等价的)。要求留意的是,一般来讲,GET是从服务器取数据,但在此例子中GET却是往服务器发多少。假如是上传文件,就亟须用POST。大家将在此后的章节中讲到。

【工程文件】

链接:http://pan.baidu.com/s/1euPiQ

密码:00y6

 

相关文章

网站地图xml地图