网络相关系列之三:通过GET和POST方法发送数据

写在最前面:年少的安逸舒适在随着年龄的到来和现实生活的压迫总有一天会全数归还(其实就是《无间道》中那句:“出来混,迟早要还的!“)

so fighting!

一、GET和POST的对比:

在漫长的时间当中,其他的方法逐渐的退出了历史舞台,最常用的只剩下GET和POST方法。而之前已经讲过了通过GET方法获取数据,今天来学习一下如何分别通过GET和POST获取数据。

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

含义如下:

  • GET:通过请求URI得到资源。一般用于获取/查询资源信息。
  • POST:用于向服务器提交新的内容。一般用于更新资源信息。

主要区别如下:

  • GET方法主要用于从服务器取回数据,POST用于向服务器提交数据
  • get类似于明信片,只有请求头,没有请求体;post类似于一封信,信封上的内容为请求头;信里面的内容为请求体
  • 使用GET方法向服务器提交的数据量较小,通常不超过1K,使用POST向服务器提交的数据量通常没有限制(明信片不能多写,而写信可以写好多内容)
  • GET请求是将所要提交的数据附在URL之后,而POST请求是将提交的数据放置在请求体当中

老罗在将到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请求的实体内容中进行传输,相对慢,安全性较高
    ,请求数据的大小没有限制

二、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:

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP
程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。

有了这个服务器,就相当于在本地的计算机有了一个网站,然后我们可以通过浏览器来访问这个网站。

软件下载链接:http://tomcat.apache.org/

下面看一下ubuntu12.04(我的环境)下的配置安装过程:

1、从官方网站上下载tomcat软件包。

http://tomcat.apache.org/

点击左侧的download的一个版本,我选择的是 tomcat8.0,你可以根据自己的实际情况进行选择安装,点击超连接,选择 Binary Distributions 下的tar.gz (pgp, md5) 压缩包,进行下载

2、下载到本地后,进行解压

tar zxvf apache-tomcat-8.0.33

3、进行tomcat环境的配置(前提需要安装jdk)

在/etc/profile文件末尾添加一句并保存:

export TOMCAT_HOME=/你的解压目录/apach-tomcat-8.0.33

然后source /etc/profile

4、启动tomcat服务器

进入刚才的tomcat解压后的目录中的bin目录下,执行start.sh脚本,服务器就会启动

5、在浏览器中输入http://localhost:8080/就可以看到tomcat的log了:

我们现在在浏览器上测试一下它吧:

首先在opt/apache-tomcat-8.0.33/webapps/ROOT目录中新建一个test.jsp文件:

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

现在我们随便起一个用户名和密码的账号,比如用户名andy,密码为koozxcv,然后在浏览器中输入如下内容:

http://localhost:8080/test.jsp?name=andy&password=koozxcv

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

上图中表示,我们向服务器发送这样一个请求,链接中,问号前面的内容代表请求的路径,问号后面是我们要传送的参数(键是固定不变的,值是用户自己填写的),然后服务器返还给我们这样的数据。

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

我们在博客“Android系列之网络(一)”中其实就已经通过GET方法向服务器获取数据了,只不过那篇文章中是访问百度首页,然后获取百度首页的数据。现在我们要通过同样的GET方法,只不过是换成了获取本地服务器搭建的网站数据。

只需要稍微修改一下那篇文章中的代码(代码结构一样,只是换了另外一个链接)。完整版代码如下:

<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的代码如下:

package com.example.m04_http02;

 import java.io.BufferedReader;
 import java.io.InputStreamReader;
 import java.util.ArrayList;
 import org.apache.http.HttpEntity;
 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.HttpGet;
 import org.apache.http.client.methods.HttpPost;
 import org.apache.http.impl.client.DefaultHttpClient;
 import org.apache.http.message.BasicNameValuePair;

 import android.app.Activity;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.widget.Button;
 import android.widget.EditText;

 public class MainActivity extends Activity {

     private EditText nameText;
     private EditText pwdText;
     private Button button;

     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         nameText = (EditText) findViewById(R.id.nameText);
         pwdText = (EditText) findViewById(R.id.pwdText);
         button = (Button) findViewById(R.id.button1);

         button.setOnClickListener(new OnClickListener() {

             @Override
             public void onClick(View v) {
                 // TODO Auto-generated method stub
                 // 用户输入用户名密码, 然后通过Get方法发送给本地服务器
                 String name = nameText.getText().toString();
                 String pwd = pwdText.getText().toString();

                 // 运行线程,使用GET方法向本地服务器发送数据
                 GetThread getThread = new GetThread(name, pwd);
                 getThread.start();
             }
         });
     }

     //子线程:通过GET方法向服务器发送用户名、密码的信息
     class GetThread extends Thread {

         String name;
         String pwd;
         public GetThread(String name, String pwd) {
             this.name = name;
             this.pwd = pwd;
         }

         @Override
         public void run() {
             //用HttpClient发送请求,分为五步
             //第一步:创建HttpClient对象
             HttpClient httpClient = new DefaultHttpClient();
             String url = "http://localhost:8080/test.jsp?name=" + name+ "&password=" + pwd;
             //第二步:创建代表请求的对象,参数是访问的服务器地址
             HttpGet httpGet = new HttpGet(url);
             try {
                 //第三步:执行请求,获取服务器发还的相应对象
                 HttpResponse response = httpClient.execute(httpGet);
                 //第四步:检查相应的状态是否正常:检查状态码的值是200表示正常
                 if (response.getStatusLine().getStatusCode() == 200) {
                     //第五步:从相应对象当中取出数据,放到entity当中
                     HttpEntity entity = response.getEntity();
                     BufferedReader reader = new BufferedReader(
                             new InputStreamReader(entity.getContent()));
                     String result = reader.readLine();
                     Log.d("HTTP", "GET:" + result);
                 }
             } catch (Exception e) {
                 e.printStackTrace();
             }

         }
     }
 } 

运行程序后,输入用户名密码,可以看到在后台打印出了我们所输入的用户名和密码:

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

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

<span style="font-family:Verdana, Arial, Helvetica, sans-serif;">  package com.example.m04_http02;
  import java.io.BufferedReader;
  import java.io.InputStreamReader;
  import java.util.ArrayList;

  import org.apache.http.HttpEntity;
  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.HttpGet;
  import org.apache.http.client.methods.HttpPost;
  import org.apache.http.impl.client.DefaultHttpClient;
  import org.apache.http.message.BasicNameValuePair;

  import android.app.Activity;
  import android.os.Bundle;
  import android.util.Log;
  import android.view.View;
  import android.view.View.OnClickListener;
  import android.widget.Button;
  import android.widget.EditText;

  public class MainActivity extends Activity {

      private EditText nameText;
      private EditText pwdText;
      private Button button;

      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          nameText = (EditText) findViewById(R.id.nameText);
          pwdText = (EditText) findViewById(R.id.pwdText);
          button = (Button) findViewById(R.id.button1);

          button.setOnClickListener(new OnClickListener() {

              @Override
              public void onClick(View v) {
                  // TODO Auto-generated method stub
                  // 用户输入用户名密码, 然后通过Get方法发送给本地服务器
                  String name = nameText.getText().toString();
                  String pwd = pwdText.getText().toString();

                  // 使用GET方法向本地服务器发送数据
                  //GetThread getThread = new GetThread(name, pwd);
                  //getThread.start();                

                  //使用POST方法向服务器发送数据
                  PostThread postThread = new PostThread(name, pwd);
                  postThread.start();
              }
          });
      }

      //子线程:通过GET方法向服务器发送用户名、密码的信息
      class GetThread extends Thread {

          String name;
          String pwd;

          public GetThread(String name, String pwd) {
              this.name = name;
              this.pwd = pwd;
          }

          @Override
          public void run() {
              //用HttpClient发送请求,分为五步
              //第一步:创建HttpClient对象
              HttpClient httpClient = new DefaultHttpClient();
              String url = "http://192.168.191.4:8080/test.jsp?name=" + name+ "&password=" + pwd;
              //第二步:创建代表请求的对象,参数是访问的服务器地址
              HttpGet httpGet = new HttpGet(url);
              try {
                  //第三步:执行请求,获取服务器发还的相应对象
                  HttpResponse response = httpClient.execute(httpGet);
                  //第四步:检查相应的状态是否正常:检查状态码的值是200表示正常
                  if (response.getStatusLine().getStatusCode() == 200) {
                      //第五步:从相应对象当中取出数据,放到entity当中
                      HttpEntity entity = response.getEntity();
                      BufferedReader reader = new BufferedReader(
                              new InputStreamReader(entity.getContent()));
                      String result = reader.readLine();
                      Log.d("HTTP", "GET:" + result);
                  }
              } catch (Exception e) {
                  e.printStackTrace();
              }

          }
      }    

      //子线程:使用POST方法向服务器发送用户名、密码等数据
     class PostThread extends Thread {

         String name;
         String pwd;

         public PostThread(String name, String pwd) {
             this.name = name;
             this.pwd = pwd;
         }
          @Override
         public void run() {
             HttpClient httpClient = new DefaultHttpClient();
             String url = "http://192.168.1.112:8080/test.jsp";
             //第二步:生成使用POST方法的请求对象
             HttpPost httpPost = new HttpPost(url);
             //NameValuePair对象代表了一个需要发往服务器的键值对
             NameValuePair pair1 = new BasicNameValuePair("name", name);
             NameValuePair pair2 = new BasicNameValuePair("password", pwd);
             //将准备好的键值对对象放置在一个List当中
             ArrayList<NameValuePair> pairs = new ArrayList<NameValuePair>();
             pairs.add(pair1);
             pairs.add(pair2);
             try {
                 //创建代表请求体的对象(注意,是请求体)
                 HttpEntity requestEntity = new UrlEncodedFormEntity(pairs);
                 //将请求体放置在请求对象当中
                 httpPost.setEntity(requestEntity);
                 //执行请求对象
                 try {
                     //第三步:执行请求对象,获取服务器发还的相应对象</span>
                     HttpResponse response = httpClient.execute(httpPost);
                     //第四步:检查相应的状态是否正常:检查状态码的值是200表示正常
                     if (response.getStatusLine().getStatusCode() == 200) {
                         //第五步:从相应对象当中取出数据,放到entity当中
                         HttpEntity entity = response.getEntity();
                         BufferedReader reader = new BufferedReader(
                                 new InputStreamReader(entity.getContent()));
                         String result = reader.readLine();
                         Log.d("HTTP", "POST:" + result);
                     }
                 } catch (Exception e) {
                     e.printStackTrace();
                 }
             } catch (Exception e) {
                 e.printStackTrace();
             }
         }
     }

 }

上方代码中,我们新开一个子线程,使用POST方法向服务器发送用户名、密码等数据。我们之前已经知道,使用GET方法发送HTTP请求有五大步骤,而如今换成POST方法时,需要在第二步和第三步之间加入一些步骤,多的步骤其实是往请求对象中加入请求体。现在来详细解释一下这部分代码:

我们通过NameValuePair集合来存放待提交的参数,并将这个参数集合传入到一个UrlEncodedFormEntity当中(这个类的对象就代表了一个请求体,即键值对),然后将请求体放置在请求对象httpPost当中。

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

现在我们总结一下POST提交数据的步骤:

  • 1. 构造请求对象;
  • 2. 将需要传递给服务器端的数据放置在键值对对象当中;
  • 3. 将准备好的键值对放置在List当中;
  • 4. 生成代表请求体的对象;
  • 5. 将存有请求键值对的List对象放置在请求题对象当中;
  • 6. 将请求体对象放置到请求对象当中;
  • 7. 发送请求对象
  • 后面的步骤(即处理请求对象)和GET方法是一致的。

上面两段的例子,都是通过GET和POST往服务器发送数据(在此,二者的作用是等价的)。需要注意的是,一般来讲,GET是从服务器取数据,但在此例子中GET却是往服务器发数据。如果是上传文件,就必须用POST。

时间: 2024-10-14 13:04:46

网络相关系列之三:通过GET和POST方法发送数据的相关文章

完毕port(CompletionPort)具体解释 - 手把手教你玩转网络编程系列之三

手把手叫你玩转网络编程系列之三    完毕port(Completion Port)具体解释                                                              ----- By PiggyXP(小猪) 前 言 本系列里完毕port的代码在两年前就已经写好了,可是因为许久没有写东西了,不知该怎样提笔,所以这篇文档总是在酝酿之中--酝酿了两年之后,最终决定開始动笔了,但愿还不算晚-.. 这篇文档我很具体而且图文并茂的介绍了关于网络编程模型中完毕

TCP/IP网络编程系列之三

TCP/IP网络编程系列之三-地址族与数据序列 分配给套接字的IP地址和端口 IP是Internet Protocol (网络协议)的简写,是为首发网络数据而分配给计算机的值.端口号并非赋予计算机值,而是为了区分程序中创建的套接字而分配给套接字的序号. 网络地址 网络地址分为IPV4和IPV6,分别你别为4个字节地址簇和6个字节地址簇.IPV4标准的4个字节的地址分为网络地址和主机地址,且分为A.B.C.D.E 等类型.一般很少用到E类型.如下图所示:net-id指网络ID,host-id指主机

TCP/IP网络编程系列之三(初级)

TCP/IP网络编程系列之三-地址族与数据序列 分配给套接字的IP地址和端口 IP是Internet Protocol (网络协议)的简写,是为首发网络数据而分配给计算机的值.端口号并非赋予计算机值,而是为了区分程序中创建的套接字而分配给套接字的序号. 网络地址 网络地址分为IPV4和IPV6,分别你别为4个字节地址簇和6个字节地址簇.IPV4标准的4个字节的地址分为网络地址和主机地址,且分为A.B.C.D.E 等类型.一般很少用到E类型.如下图所示:net-id指网络ID,host-id指主机

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

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4006009.html 联系方式:[email protected] [系列]Android系列之网络:(持续更新) Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据) Android系列之网络(二)----HTTP请求头与响应头 Android

网络相关系列之四:数据解析之SAX方式解析XML数据

一.XML和Json数据的引入: 通常情况下.每一个须要訪问网络的应用程序都会有一个自己的server.我们能够向server提交数据,也能够从server获取数据.只是这个时候就有一个问题,这些数据是以什么格式在网络上传输的呢?一般我们都会在网络上传输一些格式化后的数据,这样的数据会有一定的结构规格和语言,当还有一方收到数据消息后就能够依照同样的结构规格进行解析.从而取出它想要的那部分内容. 在网络上数据传输最经常使用的格式:XML和Json.本文就来学习一下XML数据的解析,Json格式的数

[原创.数据可视化系列之三]使用Ol3加载大量点数据

不管是百度地图还是高德地图,都很难得见到在地图上加载大量点要素,比如同屏1000的,因为这样客户端性能会很低,尤其是IE系列的浏览器,简直是卡的要死.但有的时候,还真的需要,比如,我要加载全球的AQI的测站和数据,这些站点在全球有4000多个,如何加载这些点并提高,OL3的ImageVector是一个很好地选择,简单的说,就是把这些要素渲染到一张图上,这样提高性能.代码如下: //加载JSON数据    mainxiu.loaddata=function(options)    {       

CGI原理解析系列之三----CGI如何完整获取WEB服务器数据

//模拟了服务器端 httpd 进程启动 cgi的过程, //完整展现了 get,post 方法支持 //gcc -g httpd_all.c -o httpd_all.ums; #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/wait.h> #include <stdlib.h> #define CGI_NAME "get_post.um

Java基础知识强化之网络编程笔记06:TCP之TCP协议发送数据 和 接收数据

1. TCP协议发送数据 和 接收数据 TCP协议接收数据:• 创建接收端的Socket对象• 监听客户端连接.返回一个对应的Socket对象• 获取输入流,读取数据显示在控制台• 释放资源 TCP协议发送数据: • 创建发送端的Socket对象• 这一步如果成功,就说明连接已经建立成功了.• 获取输出流,写数据• 释放资源 2. 代码实现: (1)发送端: 1 package cn.itcast_06; 2 3 import java.io.IOException; 4 import java

Java基础知识强化之网络编程笔记03:UDP之UDP协议发送数据 和 接收数据

1. UDP协议发送数据 和 接收数据 UDP协议发送数据: • 创建发送端的Socket对象 • 创建数据,并把数据打包 • 调用Socket对象的发送方法,发送数据包 • 释放资源  UDP协议接收数据:       • 创建接收端的Socket对象      • 创建数据包,接收数据(接收容器)      • 调用Socket对象的接收方法,接收数据包      • 解析数据包,并显示在控制台      • 释放资源 2. 代码实现 (1)首先我们先写发送端的程序,如下: 1 packag