网络相关系列之三:通过GET和POST方法发送数据
写在最前面:年少的安逸舒适在随着年龄的到来和现实生活的压迫总有一天会全数归还(事实上就是《无间道》中那句:“出来混,迟早要还的!“)
so fighting。
一、GET和POST的对照:
在漫长的时间其中,其它的方法逐渐的退出了历史舞台,最经常使用的仅仅剩下GET和POST方法。
而之前已经讲过了通过GET方法获取数据,今天来学习一下怎样分别通过GET和POST获取数据。
举个样例:get类似于明信片。仅仅有请求头,没有请求体。
而post类似于一封信,信封上的内容为请求头;信里面的内容为请求体(请求头和请求体是分开的)。
含义例如以下:
- GET:通过请求URI得到资源。一般用于获取/查询资源信息。
- POST:用于向server提交新的内容。一般用于更新资源信息。
主要差别例如以下:
- GET方法主要用于从server取回数据,POST用于向server提交数据
- get类似于明信片,仅仅有请求头,没有请求体;post类似于一封信,信封上的内容为请求头;信里面的内容为请求体
- 使用GET方法向server提交的数据量较小。通常不超过1K,使用POST向server提交的数据量通常没有限制(明信片不能多写。而写信能够写好多内容)
- GET请求是将所要提交的数据附在URL之后,而POST请求是将提交的数据放置在请求体其中
老罗在将到get和post请求的时候, 是这样说的:
- 1、GET是从server上获取数据。POST是向server传送数据。
- 2、在client。 GET方式在通过URL提交数据。数据在URL中能够看到;POST方式,数据放置在HTML HEADER内提交
- 3、对于GET方式,server端用Request.QueryString获取变量的值。对于POST方式。server端用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:代表一个万维网server
- mbalib.com/:server的域名。或server名称
- China/:子目录,类似于我们的目录
- Index.htm:是目录中的一个文件
- /china/index.htm统称为URL路径
三、使用tomcat软件在本地搭建server:
先来简介一下Tomcat:
Tomcat server是一个免费的开放源码的Web 应用server,属于轻量级应用server。在中小型系统和并发訪问用户不是非常多的场合下被普遍使用。是开发和调试JSP
程序的首选。
对于一个刚開始学习的人来说,能够这样觉得,当在一台机器上配置好Apache server。可利用它响应HTML(标准通用标记语言下的一个应用)页面的訪问请求。实际上Tomcat 部分是Apache server的扩展,但它是独立执行的,所以当你执行tomcat 时,它实际上作为一个与Apache 独立的进程单独执行的。
有了这个server。就相当于在本地的计算机有了一个站点,然后我们能够通过浏览器来訪问这个站点。
软件下载链接: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、启动tomcatserver
进入刚才的tomcat解压后的文件夹中的bin文件夹下。运行start.sh脚本,server就会启动
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); //在浏览器上显示输入地址中的username和password
%>
如今我们随便起一个username和password的账号。比方usernameandy,password为koozxcv。然后在浏览器中输入例如以下内容:
http://localhost:8080/test.jsp?
name=andy&password=koozxcv
输入这个链接之后,回车,出现例如以下界面:
上图中表示,我们向server发送这样一个请求,链接中。问号前面的内容代表请求的路径,问号后面是我们要传送的參数(键是固定不变的,值是用户自己填写的),然后server返还给我们这种数据。
四、使用GET方法向server发送数据:
我们在博客“Android系列之网络(一)”中事实上就已经通过GET方法向server获取数据了。仅仅只是那篇文章中是訪问百度首页,然后获取百度首页的数据。如今我们要通过相同的GET方法。仅仅只是是换成了获取本地server搭建的站点数据。
仅仅须要略微改动一下那篇文章中的代码(代码结构一样。仅仅是换了另外一个链接)。完整版代码例如以下:
<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
// 用户输入usernamepassword, 然后通过Get方法发送给本地server
String name = nameText.getText().toString();
String pwd = pwdText.getText().toString(); // 执行线程,使用GET方法向本地server发送数据
GetThread getThread = new GetThread(name, pwd);
getThread.start();
}
});
} //子线程:通过GET方法向server发送username、password的信息
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;
//第二步:创建代表请求的对象,參数是訪问的server地址
HttpGet httpGet = new HttpGet(url);
try {
//第三步:执行请求,获取server发还的对应对象
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();
} }
}
}
执行程序后,输入usernamepassword,能够看到在后台打印出了我们所输入的username和password:
五、使用POST方法向server发送数据:
上一段中。我们是通过GET方法向server发送数据,如今通过POST方法向server发送数据。布局文件的代码不变,就不写了。
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
// 用户输入usernamepassword, 然后通过Get方法发送给本地server
String name = nameText.getText().toString();
String pwd = pwdText.getText().toString(); // 使用GET方法向本地server发送数据
//GetThread getThread = new GetThread(name, pwd);
//getThread.start(); //使用POST方法向server发送数据
PostThread postThread = new PostThread(name, pwd);
postThread.start();
}
});
} //子线程:通过GET方法向server发送username、password的信息
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;
//第二步:创建代表请求的对象,參数是訪问的server地址
HttpGet httpGet = new HttpGet(url);
try {
//第三步:运行请求,获取server发还的对应对象
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方法向server发送username、password等数据
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对象代表了一个须要发往server的键值对
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 {
//第三步:运行请求对象,获取server发还的对应对象</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方法向server发送username、password等数据。
我们之前已经知道,使用GET方法发送HTTP请求有五大步骤。而现在换成POST方法时,须要在第二步和第三步之间增加一些步骤,多的步骤事实上是往请求对象中增加请求体。
现在来详解一下这部分代码:
我们通过NameValuePair集合来存放待提交的參数,并将这个參数集合传入到一个UrlEncodedFormEntity其中(这个类的对象就代表了一个请求体,即键值对),然后将请求体放置在请求对象httpPost其中。
程序执行后,输入username和password,点击button,在后台打印出了之前输入的usernamepassword:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
如今我们总结一下POST提交数据的步骤:
- 1. 构造请求对象;
- 2. 将须要传递给server端的数据放置在键值对对象其中。
- 3. 将准备好的键值对放置在List其中;
- 4. 生成代表请求体的对象;
- 5. 将存有请求键值对的List对象放置在请求题对象其中;
- 6. 将请求体对象放置到请求对象其中。
- 7. 发送请求对象
- 后面的步骤(即处理请求对象)和GET方法是一致的。
上面两段的样例,都是通过GET和POST往server发送数据(在此,二者的作用是等价的)。
须要注意的是,一般来讲。GET是从server取数据。但在此样例中GET却是往server发数据。
假设是上传文件,就必须用POST。
网络相关系列之三:通过GET和POST方法发送数据的更多相关文章
- 完毕port(CompletionPort)具体解释 - 手把手教你玩转网络编程系列之三
手把手叫你玩转网络编程系列之三 完毕port(Completion Port)具体解释 ...
- TCP/IP网络编程系列之三(初级)
TCP/IP网络编程系列之三-地址族与数据序列 分配给套接字的IP地址和端口 IP是Internet Protocol (网络协议)的简写,是为首发网络数据而分配给计算机的值.端口号并非赋予计算机值, ...
- Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- (转载)完成端口(CompletionPort)详解 - 手把手教你玩转网络编程系列之三
转自:http://blog.csdn.net/piggyxp/article/details/6922277 前 言 本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了,不知该如何 ...
- 网络相关系列之四:数据解析之SAX方式解析XML数据
一.XML和Json数据的引入: 通常情况下.每一个须要訪问网络的应用程序都会有一个自己的server.我们能够向server提交数据,也能够从server获取数据.只是这个时候就有一个问题,这些数据 ...
- 网络相关系列之中的一个:Android中使用HttpClient发送HTTP请求
一.HTTP协议初探: HTTP(Hypertext Transfer Protocol)中文 "超文本传输协议",是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议,是 ...
- 网络协议系列之三:IP
前言 这篇博客主要对IP协议中一些基础知识点加以总结,并将书中一些晦涩难懂的部分去除了.IP地址协议是网络层中最重要的协议,IP地址协议能够对因特网上的全部设备进行唯一标识.也正由于有了IP协议,我们 ...
- [原创.数据可视化系列之三]使用Ol3加载大量点数据
不管是百度地图还是高德地图,都很难得见到在地图上加载大量点要素,比如同屏1000的,因为这样客户端性能会很低,尤其是IE系列的浏览器,简直是卡的要死.但有的时候,还真的需要,比如,我要加载全球的AQI ...
- Java基础知识强化之网络编程笔记06:TCP之TCP协议发送数据 和 接收数据
1. TCP协议发送数据 和 接收数据 TCP协议接收数据:• 创建接收端的Socket对象• 监听客户端连接.返回一个对应的Socket对象• 获取输入流,读取数据显示在控制台• 释放资源 TCP协 ...
随机推荐
- css之定位(position)
1.什么是定位: css中的position属性,position有四个值:absolute/relative/fixed/static(绝对/相对/固定/静态(默认))通过定位属性可以设置一些不规则 ...
- HTML5 设备上的API
一.Vibration API ,接受两种类型参数 vibrate (unsigned long time) 当参数是unsigned long的时候 此时参数表示震动时间. NotSuppor ...
- 脚本检测 media query 分界点
当需要为不同屏幕大小添加不同脚本的时候,首先需要检测对应的media query 是否起效 也就是CSS( @screen only and (min-width: 40em) {})和javascr ...
- 基于HTML5 Canvas的CSG构造实体几何书架
CSG 构造实体几何这个概念在工业水利水电施工上.游戏上已经有很多人使用了,最简单的实体表示叫作体元,通常是形状简单的物体,如立方体.圆柱体.棱柱.棱锥.球体.圆锥等.根据每个软件包的不同这些体元也有 ...
- RE: Javascript分页处理
背景: 调用PHP后端给的接口,以实现分页的功能.由于我是没造轮子的能力,所以翻了不少技术博客,经过整合才算完成整个分页功能.从一番查阅中,不难看出大概分为两种不同的分页: 一种是纯前端的,就是在一次 ...
- MongoDB安装(windows 10环境)
1. 下载 https://www.mongdb.com/ 选择版本:ws 2008 R2 64bit 2. 安装运行下载完成的MSI文件 安装时候选择自定义配置,选择安装路径,安装到E盘 等待2分钟 ...
- 由浅入深学习springboot中使用redis
很多时候,我们会在springboot中配置redis,但是就那么几个配置就配好了,没办法知道为什么,这里就详细的讲解一下 这里假设已经成功创建了一个springboot项目. redis连接工厂类 ...
- [转载] 网络IO模型
转载自http://blog.csdn.net/zhoudaxia/article/details/8974779 同步(synchronous) IO和异步(asynchronous) IO,阻塞( ...
- label的作用是什么?是怎么用的?
label标签是用来定义表单控制间的关系,当用户选择该标签时,浏览器会自动将焦点转到和标签相关的表单控件上. 主要有以下两种用法用法: 一. <label for = "Name&qu ...
- WPF字符串中的换行符
<sys:String x:Key="NewUpdateWillShow" xml:space="preserve">第一行 第二行 </sy ...