前面记录过一篇关于http通信,发送数据的文章:http://www.cnblogs.com/hyyq/p/7089040.html,今天要记录的是如何通过http模拟表单提交数据

一、通过GET请求方式提交:最简单的一种方式

  直接在链接后面跟上要提交的数据即可,比如: http://yychf.55555.io/get.do?username=yyc&password=yychf,通过http直接发送。然后在服务器端可以通过request.getParameter()方法来获得参数值。如要获得参数username的值可以通过request.getParameter("username");

二、通过POST请求方式提交:发送更多数据

  post请求方式参数比较隐蔽,数据的传输在请求的数据体中。一般来说,我们用POST提交表单会出现在前端html代码中,通过submit将数据提交到表单地址中,现在需要通过纯java代码实现表单的提交。其实原理也很简单,主要需要注意以下两点:

  1. 作为表单提交数据,需要设置它的请求头,主要是Content-Type的值, 这里的值是application/x-www-form-urlencoded
  2. 需要将参数转换成如key1=urlencode(value1)&key2=urlencode(value2)的形式,这里的urlencode是指将参数值用urlencode编码,其实就是是将表单字段和经过编码的字段值经过组合以数据体的方式做了参数传递。

  下面是具体实现代码:

 /**
* 发起http请求
* 发送参数(仿表单提交效果):
* 基本思路:1.请求头“Content-Type”的值为“application/x-www-form-urlencoded”
* 2.将参数拼接成key=value形式的字符串post提交
* 注意:key=value中key,value即参数名、值不能有中文字符,
* 所以发送的数据就是key1=urlencode(value1)&key2=urlencode(value2)&...形式的字符串
* @param urlString
* @param formProperties
* @return
* @throws Exception
*/
public static byte[] httpRequestPostForm(String urlString,Properties formProperties) throws Exception{ //设置http请求头信息
Properties requestProperties = new Properties();
requestProperties.setProperty("Content-Type", "application/x-www-form-urlencoded"); //将需要发送的参数拼接成key1=urlencode(value1)&key2=urlencode(value2)&...形式的字符串
StringBuilder sb = new StringBuilder();
if ((formProperties != null) && (formProperties.size() > 0)) {
for (Map.Entry<Object, Object> entry : formProperties.entrySet()) {
String key = String.valueOf(entry.getKey());
String value = String.valueOf(entry.getValue());
sb.append(key);
sb.append("=");
sb.append(encode(value));//urlencode编码
sb.append("&");
}
} String str = sb.toString();
str = str.substring(0, (str.length() - 1)); // 截掉末尾字符“&” return requestPost(urlString, str.getBytes("UTF-8"), requestProperties);
} /**
* 发送http请求,并获取返回的数据
* @param urlString
* @param requestData
* @param requestProperties
* @return
* @throws Exception
*/
private static byte[] requestPost(String urlString, byte[] requestData, Properties requestProperties)
throws Exception {
byte[] responseData = null;
HttpURLConnection con = null; try {
URL url = new URL(urlString);
con = (HttpURLConnection) url.openConnection(); if ((requestProperties != null) && (requestProperties.size() > 0)) {//设置请求头信息
for (Map.Entry<Object, Object> entry : requestProperties
.entrySet()) {
String key = String.valueOf(entry.getKey());
String value = String.valueOf(entry.getValue());
con.setRequestProperty(key, value);
}
} con.setRequestMethod("POST"); // 置为POST方法 con.setDoInput(true); // 开启输入流
con.setDoOutput(true); // 开启输出流 // 如果请求数据不为空,输出该数据。
if (requestData != null) {
DataOutputStream dos = new DataOutputStream(con
.getOutputStream());
dos.write(requestData);
dos.flush();
dos.close();
} int length = con.getContentLength();
// 如果回复消息长度不为-1,读取该消息。
if (length != -1) {
DataInputStream dis = new DataInputStream(con.getInputStream());
responseData = new byte[length];
dis.readFully(responseData);
dis.close();
}
} catch (Exception e) {
throw e;
} finally {
if (con != null) {
con.disconnect();
}
} return responseData;
} /**
* url解码
*
* @param url
* @return 解码后的字符串,当异常时返回原始字符串。
*/
private static String decode(String url) {
try {
return URLDecoder.decode(url, "UTF-8");
} catch (UnsupportedEncodingException ex) {
return url;
}
} /**
* url编码
*
* @param url
* @return 编码后的字符串,当异常时返回原始字符串。
*/
private static String encode(String url) {
try {
return URLEncoder.encode(url, "UTF-8");
} catch (UnsupportedEncodingException ex) {
return url;
}
}

  发送数据前,需要将数据放入Properties对象中再传入,这是java.util包中的一个工具类,本来主要作用是读取java中以.properties结尾的配置文件,关于这个推荐http://www.cnblogs.com/hyyq/p/7399525.html。当然,这里完全也可以用Map集合来实现。

  发送数据后,服务端可以通过request.getParameter()方法来获得参数值,也可以通过request.getParameterMap()来获取,它返回的是一个Map<String,String[]>类型的值,因为我们知道表单有 如性别之类的属性是有两个值的。

  小结:通过http模拟表单提交数据,其实和普通的数据提交也是换汤不换药。

  参考:http://blog.163.com/xing_mu_1/blog/static/6614290201031310207158/

HTTP通信模拟表单提交数据的更多相关文章

  1. <记录> axios 模拟表单提交数据

    ajax 可以通过 FormData 对象模拟表单提交数据 第一种方式:自定义FormData信息 //创建formData对象 var formData = new FormData(); //添加 ...

  2. C# Winform利用POST传值方式模拟表单提交数据(Winform与网页交互)

    其原理是,利用winfrom模拟表单提交数据.将要提交的參数提交给网页,网页运行代码.得到数据.然后Winform程序将网页的全部源码读取下来.这样就达到windows应用程序和web应用程序之间传參 ...

  3. js模拟form表单提交数据, js模拟a标签点击跳转,避开使用window.open引起来的浏览器阻止问题

    js模拟form表单提交数据, js模拟a标签点击跳转,避开使用window.open引起来的浏览器阻止问题 js模拟form表单提交数据源码: /** * js模拟form表单提交 * @param ...

  4. 项目总结15:JavaScript模拟表单提交(实现window.location.href-POST提交数据效果)

    JavaScript模拟表单提交(实现window.location.href-POST提交数据效果) 前沿 1-在具体项目开发中,用window.location.href方法下载文件,因windo ...

  5. 由于想要实现下载的文件可以进行选择,而不是通过<a>标签写死下载文件的参数,所以一直想要使用JFinal结合ajax实现文件下载,但是ajax实现的文件下载并不能触发浏览器的下载文件弹出框,这里通过模拟表单提交实现同样的效果。

    由于想要实现下载的文件可以进行选择,而不是通过<a>标签写死下载文件的参数,所以一直想要使用JFinal结合ajax实现文件下载(这样的话ajax可以传递不同的参数),但是ajax实现的文 ...

  6. 利用HttpWebRequest模拟表单提交 JQuery 的一个轻量级 Guid 字符串拓展插件. 轻量级Config文件AppSettings节点编辑帮助类

    利用HttpWebRequest模拟表单提交   1 using System; 2 using System.Collections.Specialized; 3 using System.IO; ...

  7. 使用axios模拟表单提交

    1.需求背景 最近在实验室写一个Spring前后端分离的项目,项目中使用Spring Security组件实现系统的认证和授权,当Security的认证模式设置为FormLogin时(如下代码),前端 ...

  8. from表单提交数据之后,后台对象接受不到值

    如果SSH框架下,前段页面通过from表单提交数据之后,在后台对象显示空值,也就是接收不到值得情况下.首先保证前段输入框有值,这个可以在提交的时候用jQuery的id或者name选择器alert弹出测 ...

  9. 表单提交---前端页面模拟表单提交(form)

    有些时候我们的前端页面总没有<form></form>表单,但是具体的业务时,我们又必须用表单提交才能达到我们想要的结果,LZ最近做了一些关于导出的一些功能,需要调用浏览器默认 ...

随机推荐

  1. SharePoint解决方案及开发系列(2)-ECM

    很多次跟客户做咨询及沟通的时候,客户都问SharePoint能做什么?是不是就是做文档管理?为什么要花那么多的钱没SharePoint?高大上? 我上家公司面试的时候,我的那个BOSS面试官有一个问题 ...

  2. 用javascript复制富文本

    由于项目需求,希望能够用javascript复制富文本格式的数据,例如全选一个网页Ctrl+C, Ctrl+V到一个word文档中,数据还是原来的格式,显示出来的样子也都和原来一样.现在希望使用jav ...

  3. EasyNVR和EasyDSS云平台联手都不能解决的事情,只有国标GB28181能解决了

    需求痛点 我们经常收到这样一种需求,就是将客户手里的各种类型的网络摄像机IPC和网络硬盘录像机NVR进行统一的整合接入和管理,并进行常规的直播.存储.录像检索和回放等操作,而这个时候我们通常会选择用E ...

  4. 注册Asp4.0到iis

  5. JavaScript通过preventDefault()使input[type=text]禁止输入但保留光标

    一.说明 取消事件的默认动作. 该方法将通知 Web 浏览器不要执行与事件关联的默认动作(如果存在这样的动作).例如,如果 type 属性是 "submit",在事件传播的任意阶段 ...

  6. MySQL权限系统(三).权限表 Grant Tables

    7.2.2 Grant Tables 授权表 The mysql system database includes several grant tables that contain informat ...

  7. HDFS权限

    1.1 超级用户 启动namenode服务的用户就是超级用户, 该用户的组是supergroup 1.2 文件权限管理   1.2.1 创建时的owner和group 文件或者目录被创建之时,服从BS ...

  8. jquery on 确认删除

    $(document).on('click', '.delbtn', function() {         if (confirm("确定要删除吗?")) {          ...

  9. 004-搭建框架-实现AOP机制【一】代理技术

    前景提要 监控方法性能.执行时间.记录日志等 AOP( Aspect Oriented Programming)面向方面编程. 在AOP中,需要定义一个Aspect(切面)类来编写需要横切业务的逻辑代 ...

  10. 《Python 机器学习》笔记(二)

    机器学习分类算法 本章将介绍最早以算法方式描述的分类机器学习算法:感知器(perceptron)和自适应线性神经元. 人造神经元--早期机器学习概览 MP神经元 生物神经元和MP神经元模型的对应关系如 ...