get和post与服务端的交互方式
在网上看了不少关于get和post的文章,看到博主这个,现在手录下来。
原博客地址:http://www.cnblogs.com/warrior4236/p/5675756.html
一:B/S结构,浏览器端到服务器端通信依赖http协议
交互过程:
1:在浏览器地址栏输入http://ip:port/应用/资源路径
2:浏览器根据ip和服务器建立连接,port确定和那个应用进行交互,因为ip主机上面有
很多应用程序。
3:浏览器端发送请求以及参数到服务器端,就是url(同一资源定位器),确定请求资源。
4:服务器处理请求,将处理后的结果响应发送到浏览器。
5:浏览器得到资源后,渲染到界面,显示给用户。
优点:B/S交互可以省去客户端部署升级的风险,降低了成本,只需要关注服务器开发。
二:C/S结构,客户端到服务器端通信也是依赖HTTP协议
主要是java应用程序与服务器的交互,交互过程:
1:根据请求url创建URL对象
2:创建连接对象URLConnection,设置连接参数,建立连接。
3:发送请求到服务器,服务器进行处理
4:服务器发送响应到客户端。
三:get请求与post请求的异同点
1:get请求会将请求参数显示在请求地址的后面,post不会,所以post相较于get更安全,但是安全是相对的,
如果追求安全发送请求还是要加密。
2:get请求发送数据理论上是4kb,而post理论上可以发送任意大的数据
3:如果是C/S结构,post请求在建立连接前,要设置DoInput和DoOutput的值
四:java程序请求服务器实例
get请求案例:
/**
* 发送get请求,参数放在url后面
*/
public static String sendGetRequest(String url, String params) {
StringBuilder result = new StringBuilder();
String realUrl = url + "?" + params;
InputStream in = null;
BufferedReader br = null;
try {
// 与服务器建立连接
URL u = new URL(realUrl);
URLConnection conn = u.openConnection();
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "keep-alive");
conn.connect();
// 获取响应头
Map<String, List<String>> map = conn.getHeaderFields();
Set<String> set = map.keySet();
Iterator<String> it = set.iterator();
while (it.hasNext()) {
String key = it.next();
System.out.println(key + ":::" + map.get(key));
}
// 获取响应数据
in = conn.getInputStream();
br = new BufferedReader(new InputStreamReader(in, "utf-8"));
String line;
while ((line = br.readLine()) != null) {
result.append(line);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != in) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != br) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result.toString();
}
post请求案例:
/**
* 发送post请求,参数单独发送到服务器端
*/
public static String sendPostRequest(String url, String params) {
StringBuilder result = new StringBuilder();
String realUrl = url;
InputStream in = null;
BufferedReader br = null;
try {
// 与服务器建立连接
URL u = new URL(realUrl);
URLConnection conn = u.openConnection();
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "keep-alive");
// post请求必须设置请求头
conn.setDoInput(true);
conn.setDoOutput(true);
conn.connect();
// 发送参数到服务器
OutputStream out = conn.getOutputStream();
PrintWriter pw = new PrintWriter(new OutputStreamWriter(out,
"utf-8"));
pw.print(params);
pw.flush();
pw.close();
// 获取响应头
Map<String, List<String>> map = conn.getHeaderFields();
Set<Entry<String, List<String>>> entry = map.entrySet();
Iterator<Entry<String, List<String>>> it = entry.iterator();
while (it.hasNext()) {
Entry<String, List<String>> en = it.next();
System.out.println(en.getKey() + ":::" + en.getValue());
}
// 获取响应数据
in = conn.getInputStream();
br = new BufferedReader(new InputStreamReader(in, "utf-8"));
String line;
while ((line = br.readLine()) != null) {
result.append(line);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != in) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != br) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result.toString();
}
测试案例:
// 测试发送请求
public static void main(String[] args) {
String url = "http://localhost:8080/healthcare/dataAnalysis/search.do";
String params = "tname=employee";
// 测试get请求
System.out.println(SendGetAndPost.sendGetRequest(url, params));
// 测试post请求
System.out.println(SendGetAndPost.sendPostRequest(url, params));
}
get和post与服务端的交互方式的更多相关文章
- WebService的web客户端同步、异步、多线程向服务端传入参数的数据交互方式
接着上一章的内容,在上一章中我们知道了如何.net平台下去建立一个WebService,以及同步调用.异步调用.开线程异步调用三种客户端从服务端获取数据的方式,在本章了所要讲的,是如何将客户端的数据, ...
- IOS开发系列之阿堂教程:玩转IPhone客户端和Web服务端交互(客户端)实践
说到ios的应用开发,我们不能不提到web server服务端,如果没有服务端的支持,ios应用开发就没有多大意义了,因为从事过手机开发的朋友都知道(Android也一样),大量复杂业务的处理和数据库 ...
- Service系统服务(六):rsync基本用法、rsync+SSH同步、配置rsync服务端、访问rsync共享资源、使用inotifywait工具、配置Web镜像同步、配置并验证Split分离解析
一.rsync基本用法 目标: 本例要求掌握远程同步的基本操作,使用rsync命令完成下列任务: 1> 将目录 /boot 同步到目录 /todir 下 2> 将目录 /boot 下的 ...
- 那些年,我们见过的 Java 服务端“问题”
导读 明代著名的心学集大成者王阳明先生在<传习录>中有云: 道无精粗,人之所见有精粗.如这一间房,人初进来,只见一个大规模如此.处久,便柱壁之类,一一看得明白.再久,如柱上有些文藻,细细都 ...
- android 应用程序与服务端交互
http://www.cnblogs.com/freeliver54/archive/2012/06/13/2547765.html 简述了Service的一些基础知识以及Service和Thread ...
- Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)
本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...
- 关于如何提高Web服务端并发效率的异步编程技术
最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...
- Socket聊天程序——服务端
写在前面: 昨天在博客记录自己抽空写的一个Socket聊天程序的初始设计,那是这个程序的整体设计,为了完整性,今天把服务端的设计细化记录一下,首页贴出Socket聊天程序的服务端大体设计图,如下图: ...
- zookeeper源码分析之五服务端(集群leader)处理请求流程
leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...
随机推荐
- commons-pool与commons-pool2连接池
commons-pool和commons-pool2是用来建立对象池的框架,提供了一些将对象池化必须要实现的接口和一些默认动作.对象池化之后可以通过pool的概念去管理其生命周期,例如对象的创建,使用 ...
- 初学者易上手的SSH-struts2 05拦截器与自定义拦截器
因为自己对于struts2也不是很了解,这章将是struts2的最后一章了.那么这一章主要介绍的是拦截器以及怎么样来自定义一个拦截器. struts2的拦截器位于struts2-core(核心包)-& ...
- java基础---字符串string
1.字符创的概念 java字符串就是Unicode字符序列.例如,串“Java\u2122”由5个Unicode字符J.a.v.a和TM.java没有内置的字符串类型,而是在标准库Java类库中提供了 ...
- 前端工程化grunt
1.grunt是什么? grunt是基于nodejs的前端构建工具.grunt用于解决前端开发的工程问题. 2.安装nodejs Grunt和所有grunt插件都是基于nodejs来运行的. 安装了n ...
- java学习笔记(一) 服务器的认识
RPC与RMI.SOAP的联系及区别 http://www.jb51.net/article/68971.htm 几大服务器的区别nginx/tomcat/ http://www.cnblogs.co ...
- asp.net core2.0网站的环境搭建和网站部署
使用到的软件和硬件 1. centos7.3服务器一台 2. xshell.xftp 3. vs2017 4. .NET Core 1. 安装 li ...
- Java8之旅(七) - 函数式备忘录模式优化递归
前言 在上一篇开始Java8之旅(六) -- 使用lambda实现Java的尾递归中,我们利用了函数的懒加载机制实现了栈帧的复用,成功的实现了Java版本的尾递归,然而尾递归的使用有一个重要的条件就是 ...
- (转) Redis学习教程--基本命令
原文出自:http://www.cnblogs.com/woshimrf/p/5198361.html 目录 全局操作:1.redis是key-value存储的,放在内存中,并在磁盘持久化的数据结构存 ...
- App 组件化/模块化之路——使用SDK的思路进行模块化设计接口
在不久之前分享一篇<App 组件化/模块化之路——如何封装网络请求框架>文章介绍了我在项目中封装网络请求框架的思路.开发一个 App 会涉及到很多网络请求 API ,例如登录注册接口.用户 ...
- Java微信公众平台开发_02_启用服务器配置
源码将在晚上上传到 github 一.准备阶段 需要准备事项: 1.一个能在公网上访问的项目: 见:[ Java微信公众平台开发_01_本地服务器映射外网 ] 2.一个微信公众平台账号: 去注册: ...