前面记录过一篇关于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. EasyNVR智能云终端硬件与EasyNVR解决方案软件综合对比

    背景分析 互联网视频直播越来越成为当前视频直播的大势,对于传统的安防监控,一般都是局限于内网,无法成批量上云台.传统的海康和大华的平台虽然可以通过自身私有协议上云平台 集总管控,但是往往只是支持自身的 ...

  2. 用SQL语句生成唯一标识

    以前都是在代码中生成GUID值,然后保存到数据库中去,今天发现用sql也能生成GUID值,觉得很新奇,所以记下来. sellect newid();  //得到的即为GUID值 此sql内置函数返回的 ...

  3. Introduction to Mathematical Thinking - Week 3

    there exists and all there exists 证明根号2是无理数 all 习题 3. Which of the following formal propositions say ...

  4. The C Programming Language Second Edition

    %12d  at least #include <stdio.h> main() { ,sum=,w=; ; ; w<=end; w++ ) { sum+=w; // for(wb= ...

  5. 不同格式的ip 统一转成ip列表

    支持以下格式的ip地址: 192.168.1.0/24 192.168.1.1-23 192.168.1.123 代码如下: package finder; import java.net.InetA ...

  6. Django 之 序列化

    Django之序列化 关于Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的为Json格式. serializers 1 2 3 4 5 from dj ...

  7. 斯坦福大学Andrew Ng - 机器学习笔记(1) -- 单变量&多变量线性回归

    大概用了一个月,Andrew Ng老师的机器学习视频断断续续看完了,以下是个人学习笔记,入门级别,权当总结.笔记难免有遗漏和误解,欢迎讨论. 鸣谢:中国海洋大学黄海广博士提供课程视频和个人笔记,在此深 ...

  8. hdu 2112 HDU Today(map与dijkstra的结合使用)

    HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  9. python 报错——Python TypeError: 'module' object is not callable 原因分析

    原因分析:Python导入模块的方法有两种: import module 和 from module import 区别是前者所有导入的东西使用时需加上模块名的限定,而后者则不需要 例: >&g ...

  10. CSS中input输入框点击时去掉外边框方法【outline:medium;】----CSS学习

    CSS 中添加 outline:medium; JS 控制焦点: $("#CUSTOM_PHONE").focus(function(event){ // this.attr(&q ...