Java模拟POST表单提交HttpClient操作

  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", "[email protected]"),
  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方式提交数据,目标收到后中文乱码问题。
请求端代码:

Java代码  

  1. /**
  2. * HttpClient提交参数
  3. * @author [email protected]
  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. }

目标端代码:

Java代码  

  1. /**
  2. * 供MsgServer远程调用
  3. * @param request
  4. * @param response
  5. * @return
  6. * @throws Exception
  7. * @author [email protected]
  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()方法就能设置提交的编码(字符集)。

修正后:

Java代码  

    1. /**
    2. * HttpClient提交参数
    3. * @author [email protected]
    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. }
时间: 2024-12-26 10:44:10

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

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

/** * java上传表单,有图片 * @param urlStr 上传地址 * @param textMap 表单参数 * @param fileMap 文件参数 key:文件名称 value:文件地址 * @return */ @SuppressWarnings("rawtypes") public static String formUpload(String urlStr, Map<String, String> textMap, Map<String, S

通过HttpURLConnection模拟post表单提交

package junit; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import org.junit.Test; import com.hrtx.util.StreamTool; public class EsmTest { /** * 通过HttpURLConnection模拟post表单提交 * @throws Exception */ @Test public

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

curl是一个命令行方式下传输数据的开源传输工具,支持多种协议:FTP.HTTP.HTTPS.IMAP.POP3.TELNET等,功能超级强大. 我今天想说的是程序开发中常用的模拟Form提交 1.GET提交 特别简单直接写url里面 2.POST提交    通过 --data/-d 方式指定使用POST方式传递数据 3.模拟form表单提交文件  --form/-F 模拟form表单提交文件 这个命令超级好用,再也不用为了写上传接口,而被迫写一个Form表单了 "[email protecte

HTML5第8次课堂笔记( 模拟form表单提交数据,xml的解析,jQuery的Ajax方法使用, mui的ajax)

HTML5第8次课堂笔记 1.  模拟form表单提交数据:(get方式) <body> <formmethod="get"action="DataTest7"> <inputtype="text"name="uname"value="yang"id="myname"><br/> <inputtype="password&q

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

js模拟form表单提交数据源码: /** * js模拟form表单提交 * @param {object} 参数对象 * url 必填 提交地址 * methond 选填 默认post 提交方式 post get * target 选填 默认_self 当前页面还是新页面 _self _blank * 其它参数 */ function jsFormSubmit(params) { var turnForm = document.createElement("form"); //一定要

Fiddler 模拟form表单提交

Fiddler 是开发人员神器,大家都见识了 今天用 Fiddler 模拟form提交,http返回状态倒是200,就是死活得不到正确的返回结果 如图: 解决方法:Content-Type: application/x-www-form-urlencoded

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

<div> <table id="outputInfo"> <tr><td>Client</td><td><input id='ClientName' type='text'></td></tr> <tr><td>CropID</td><td><input id='CropID' type='text' /></t

jquery插件-表单提交插件-jQuery.Form

1.介绍 JQuery Form插件是一款强大的Ajax表单提交插件,可以简单方便的实现让我们的表单 由传统的提交方式转换成Ajax无刷新提交! 他提供了两个核心的方法ajaxForm以及ajaxSubmit 让我们方便的实现无刷新效果提交表单! http://malsup.com/jquery/form/ https://github.com/malsup这个因该是作者的gitbub,我下载看了一下那个readme文件竟然是 API 2.快速入门 1.引入插件 (方法同jQuery) 2.将表

Java+MyEclipse+Tomcat (四)Servlet提交表单和数据库操作

前面三篇文章讲述了如何配置MyEclipse和Tomcat开发JSP网站.如何配置Servlet简单实现表单提交.如何配置MySQL实现JSP数据库查询. 这篇文章主要讲述Servlet表单的提交.Java中实现数据库的查询操作和自己遇到的瓶颈及理解.Java Web基础性文章,希望对大家有所帮助~ Java+MyEclipse+Tomcat (一)配置过程及jsp网站开发入门 Java+MyEclipse+Tomcat (二)配置Servlet及简单实现表单提交 Java+MyEclipse+