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. Android--开发过程中使用到的长度单位

    px:表示屏幕实际的像素. in:表示英寸. mm:毫米. pt:表示一个点,是屏幕的物理尺寸. dp:(与密度无关的像素)逻辑长度单位,在160dpi屏幕上,1dp = 1px = 1/160英寸 ...

  2. WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[实现篇]

    原文:WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[实现篇] 元数据的导出就是实现从ServiceEndpoint对象向MetadataSet对象转换的过程,在WCF元数据框 ...

  3. jsp截取字符串

    <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> < ...

  4. lokijs

    http://lokijs.org/#/ 500,000+ 1.1M ops/s. A fast, in-memory document-oriented datastore for node.js, ...

  5. 承诺消费换4G无线上网伴侣活动火热来袭,各指定营业厅即可办理

    承诺消费换4G无线上网伴侣活动火热来袭,各指定营业厅即可办理 承诺消费换4G无线上网伴侣活动火热来袭,各指定营业厅即可办理

  6. ORA-01093: ALTER DATABASE CLOSE only permitted with no sessions connected解决方法

    在进行物理主备库角色转换的时候遇到ORA-01093错误 SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY; ALTER ...

  7. 关于android中postDelayed方法的讲解

    这是一种可以创建多线程消息的函数使用方法:1,首先创建一个Handler对象 Handler handler=new Handler(); 2,然后创建一个Runnable对象Runnable run ...

  8. http异步请求

    1.加载异步请求包文件 2.java代码 package com.example.asynchttp; import org.apache.http.Header; import com.loopj. ...

  9. Join的实现步骤 以及连接的概念

    Join的实现步骤  以及连接的概念 我们常说连接有三种,即 交叉连接.内连接.外连接,这三者的概念很容易模糊,现在我们先放下概念,搞清楚完整连接实现的步骤: 一个完整的连接有三个步骤:.做笛卡儿积: ...

  10. 基于visual Studio2013解决C语言竞赛题之1087数字变换

        题目 解决代码及点评 /************************************************************************/ /* ...