Java模拟POST表单提交HttpClient操作

时间:2024-01-18 12:03:08
  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. }