网络编程(发送get和post请求到服务器端,并获取响应)
2016-07-16 10:39
771 查看
一: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请求案例:
post请求案例:
测试案例:
以上代码均已经过验证。
交互过程:
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)); }
以上代码均已经过验证。
相关文章推荐
- python多线程网络编程
- 计算机网络常见面试题总结
- TCP协议(三次握手和四次握手)
- HTTP协议
- 所有 HTTP 状态代码及其定义
- USACO 4.2.1 iSap + gap优化
- 网络最大流 相反的方向发回一个流 选取具有最少边数的路径
- RHCS集群服务 7.10
- HTTP状态码详解
- 关于TCP/IP和HTTP
- 影响Cache的几个HTTP头信息
- Http状态码详细说明
- 七、TCP C/S:socket 读写超时设置
- RxAndroid 与OkHttpClient打造下载实例
- buildJSONPacketBody数组形式封装json、JsonReader解析服务器返回值、封装对象、https协议
- OC网络封装工具
- Android获取当前位置(GPS和网络定位)
- 网络基本功(二十八):Wireshark抓包实例分析HTTP问题(下)
- 网络基本功(二十七):Wireshark抓包实例分析HTTP问题(上)
- 网络基本功(二十五):Wireshark抓包实例分析TCP重复ACK与乱序