1. public static void Login() {
  2. String url = "http://www.***.com/login";
  3. PostMethod postMethod = new PostMethod(url);
  4. // 填入各个表单域的值
  5. NameValuePair[] data = {
  6. new NameValuePair("account", "yijianfeng_vip@163.com"),
  7. new NameValuePair("nextUrl", ""),
  8. new NameValuePair("lcallback", ""),
  9. new NameValuePair("password    ", "******"),
  10. new NameValuePair("persistent", "1"), };
  11. // 将表单的值放入postMethod中
  12. postMethod.setRequestBody(data);
  13. // 执行postMethod
  14. int statusCode = 0;
  15. try {
  16. statusCode = httpClient.executeMethod(postMethod);
  17. } catch (HttpException e) {
  18. e.printStackTrace();
  19. } catch (IOException e) {
  20. e.printStackTrace();
  21. }
  22. // HttpClient对于要求接受后继服务的请求,象POST和PUT等不能自动处理转发
  23. // 301或者302
  24. if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY
  25. || statusCode == HttpStatus.SC_MOVED_TEMPORARILY) {
  26. // 从头中取出转向的地址
  27. Header locationHeader = postMethod.getResponseHeader("location");
  28. String location = null;
  29. if (locationHeader != null) {
  30. location = locationHeader.getValue();
  31. System.out.println("diandianLogin:" + location);
  32. } else {
  33. System.err.println("Location field value is null.");
  34. }
  35. return;
  36. } else {
  37. System.out.println(postMethod.getStatusLine());
  38. String str = "";
  39. try {
  40. str = postMethod.getResponseBodyAsString();
  41. } catch (IOException e) {
  42. e.printStackTrace();
  43. }
  44. System.out.println(str);
  45. }
  46. postMethod.releaseConnection();
  47. return;
  48. }
  49. 其中需要的jar包:
  50. 1、 commons-httpclient.jar
  51. 2、commons-codec.jar
  52. 3、commons-logging.jar

今天开发时,遇到利用Java中HttpClient类以POST方式提交数据,目标收到后中文乱码问题。
请求端代码:

  1. /**
  2. * HttpClient提交参数
  3. * @author sunyunfang@126.com
  4. */
  5. public static void main(String[] args) throws IOException {
  6. HttpClient client = new HttpClient();
  7. client.getHostConfiguration().setHost("127.0.0.1", 8081, "http");
  8. // 使用POST方式提交数据
  9. HttpMethod method = getPostMethod();
  10. client.executeMethod(method);
  11. // 打印服务器返回的状态
  12. System.out.println(method.getStatusLine());
  13. // 打印结果页面
  14. String response = new String(method.getResponseBodyAsString().getBytes("8859_1"));
  15. // 打印返回的信息
  16. System.out.println(response);
  17. method.releaseConnection();
  18. }
  19. // 使用POST方式提交数据
  20. private static HttpMethod getPostMethod() {
  21. String url = "/PushServer/notification.do?action=sendOneMsg";
  22. NameValuePair message = new NameValuePair("message", "消息内容。");
  23. post.setRequestBody(new NameValuePair[]{message});
  24. return post;
  25. }
  26. // 使用GET方式提交数据
  27. private static HttpMethod getGetMethod() {
  28. return new GetMethod("/PushServer/notification.do?action=sendOneMsg&message=abcd");
  29. }

目标端代码:

  1. /**
  2. * 供MsgServer远程调用
  3. * @param request
  4. * @param response
  5. * @return
  6. * @throws Exception
  7. * @author SunYunfang@126.com
  8. */
  9. public ModelAndView sendOneMsg(HttpServletRequest request,
  10. HttpServletResponse response) throws Exception {
  11. String message = ServletRequestUtils.getStringParameter(request, "message");
  12. }

这段代码执行后,目标能收到信息,但是中文乱码,也没有找到转码的方法。

经分析,原来使用 NameValuePair 加入的HTTP请求的参数最终都会转化为 RequestEntity
提交到HTTP服务器。接着在PostMethod的父类 EntityEnclosingMethod
中发现,只要重载getRequestCharSet()方法就能设置提交的编码(字符集)。

修正后:

    1. /**
    2. * HttpClient提交参数
    3. * @author SunYunfang@126.com
    4. */
    5. public static void main(String[] args) throws IOException {
    6. HttpClient client = new HttpClient();
    7. client.getHostConfiguration().setHost("127.0.0.1", 8081, "http");
    8. // 使用POST方式提交数据
    9. HttpMethod method = getPostMethod();
    10. client.executeMethod(method);
    11. // 打印服务器返回的状态
    12. System.out.println(method.getStatusLine());
    13. // 打印结果页面
    14. String response = new String(method.getResponseBodyAsString().getBytes("8859_1"));
    15. // 打印返回的信息
    16. System.out.println(response);
    17. method.releaseConnection();
    18. }
    19. // 使用POST方式提交数据
    20. private HttpMethod getPostMethod() {
    21. String url = "/PushServer/notification.do?action=sendOneMsg";
    22. PostMethod post = new UTF8PostMethod(url);
    23. NameValuePair message = new NameValuePair("message", "消息内容。");
    24. post.setRequestBody(new NameValuePair[]{message});
    25. return post;
    26. }
    27. //Inner class for UTF-8 support
    28. public static class UTF8PostMethod extends PostMethod{
    29. public UTF8PostMethod(String url){
    30. super(url);
    31. }
    32. @Override
    33. public String getRequestCharSet() {
    34. //return super.getRequestCharSet();
    35. return "UTF-8";
    36. }
    37. }
    38. // 使用GET方式提交数据
    39. private static HttpMethod getGetMethod() {
    40. return new GetMethod("/PushServer/notification.do?action=sendOneMsg&message=abcd");
    41. }

Java模拟POST表单提交HttpClient操作的更多相关文章

  1. java模拟from表单提交,上传图片

    /** * java上传表单,有图片 * @param urlStr 上传地址 * @param textMap 表单参数 * @param fileMap 文件参数 key:文件名称 value:文 ...

  2. 通过HttpURLConnection模拟post表单提交

    通过HttpURLConnection模拟post表单提交 package junit; import java.io.InputStream; import java.net.HttpURLConn ...

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

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

  4. js_ajax模拟form表单提交_多文件上传_支持单个删除

    需求场景: 用一个input type="file"按钮上传多张图片,可多次上传,可单独删除,最后使用ajax模拟form表单提交功能提交到指定方法中: 问题:由于只有一个file ...

  5. Linux curl 模拟form表单提交信息和文件

    Linux curl 模拟form表单提交信息和文件   curl是一个命令行方式下传输数据的开源传输工具,支持多种协议:FTP.HTTP.HTTPS.IMAP.POP3.TELNET等,功能超级强大 ...

  6. jquery模拟form表单提交并新打开页面

    /** * form表单提交本页面打开 * @param url * @param params */ function postCurrent(url,params){ var form = $(& ...

  7. Ajax模拟Form表单提交,含多种数据上传

    ---恢复内容开始--- Ajax提交表单.使用FormData提交表单数据和上传的文件(这里的后台使用C#获取,你可以使用Java一样获取) 有时候前台的数据提交到后台,不想使用form表单上传,希 ...

  8. C#模拟POST表单提交 --- WebClient

    string postString = "arg1=a&arg2=b";//这里即为传递的参数,可以用工具抓包分析,也可以自己分析,主要是form里面每一个name都要加进 ...

  9. 模拟post表单提交参数

    Content-Type: application/x-www-form-urlencoded;charset=utf-8

随机推荐

  1. 四大流行的java连接池之BoneCP篇

    BoneCP 是一个开源的快速的 JDBC 连接池.BoneCP很小,只有四十几K(运行时需要log4j和Google Collections的支持,这二者加起来就不小了),而相比之下C3P0 要六百 ...

  2. ffmpeg h265

    最新版本号的ffmpeg 支持 libh265,可是还是0基础測试阶段 在linux 上安装ffmpeg 支持h265编码器依照下面步骤: Anyhow here are the simple ste ...

  3. Swift - 获取字符串的MD5值

    MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已有MD5实现. ...

  4. C陷阱与缺陷代码分析之第2章语法陷阱

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 陷阱1 理解函数声明 作者提出一个问题:有一个首地址为0的函数,该函数返回值类型为void,没有参数.怎样用C语言的 ...

  5. TImage也有OnClick事件,可以当按钮使用,配上合适的图片(背景透明,效果前凸)更是几乎以假乱真

    本质上TImage与TSpeedButton没有什么区别,都是没有句柄的,但都可以执行OnClick事件.有空分析一下.

  6. 反应堆Reactor

    mvn -h 可以看到很多命令及其用途:-am --also-make 同时构建所列模块的依赖模块:-amd -also-make-dependents 同时构建依赖于所列模块的模块:-pl --pr ...

  7. C++数据结构之二叉树

    之前打算编算法类的程序,但是搞了几次英雄会后,觉得作为一个还在学习阶段的学生,实在是太浪费时间了,并不是没意义,而是我的基础还不牢固啊.所以转变了思路,这个学期打算分别用C++.Python.Java ...

  8. 关于innodb purge thread和master thread

    由innodb_purge_threads控制purge线程数. (>= 5.6.5)的版本号中该值默觉得1.最大值为32.默认值1表示innodb的purge操作被分离到purge线程中,ma ...

  9. 用angularjs开发下一代web应用(二):angularjs应用骨架(二)

    1.浅谈非入侵式JavaScript <div ng-click="doSomething()">...</div>这些指令和原来的事件处理器有下面不同之处 ...

  10. QNX系统-关于delay函数与sleep函数的区别

    QNX是类unix系统.在c语言编程过程中,往往会用到delay或者sleep延时函数.两者之间在使用上有一定的区别!!! delay()是循环等待,该进程还在运行,占用处理器. sleep()不同, ...