首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

httpclient札记

2012-12-21 
httpclient笔记Jakarta的httpclient3.1是最新版本,项目中需要用程序模拟浏览器的GET和POST动作。在使用过程

httpclient笔记

Jakarta的httpclient3.1是最新版本,项目中需要用程序模拟浏览器的GET和POST动作。在使用过程中遇到不少问题。
1. 带附件的POST提交
??? 最开始都是使用MultipartPostMethod这个类,现在已经废弃这个类了。API说明:Deprecated. Use MultipartRequestEntity in conjunction with PostMethod instead.?? 使用PostMethod可以实现的功能,就没有必要再弄一个MultipartPostMethod了。下面是一段最简单的示例:

PostMethod post = new PostMethod();        NameValuePair[] pairs = new NameValuePair[2];        pairs[0] = new NameValuePair("para1", "value1");        pairs[0] = new NameValuePair("para2", "value2");        post.setRequestBody(pairs);        HttpClient client = new HttpClient();        try {            client.executeMethod(post);        } catch (HttpException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }
?



?? 这是针对一般的form形式的提交,而且这个form里面不带附件的。如果带附件,那么这种方法就不起作用,附件上传的参数和普通参数无法一同在服务器获取到。org.apache.commons.httpclient.methods.multipart 这个包就是为处理文件上传这种多形式参数的情况的。最主要的类是Part(代表一种post object),它有二个比较重要的子类:FilePart和StringPart,一个是文件的参数,另一个就是普通的文本参数。它的典型使用方法如下:

String url = "http://localhost:8080/HttpTest/Test";         PostMethod postMethod = new PostMethod(url);                  StringPart sp = new StringPart("TEXT", "testValue");         FilePart fp = new FilePart("file", "test.txt", new File("./temp/test.txt"));                  MultipartRequestEntity mrp= new MultipartRequestEntity(new Part[]{sp, fp}, postMethod                 .getParams());         postMethod.setRequestEntity(mrp);                  //执行postMethod         HttpClient httpClient = new HttpClient();         try {            httpClient.executeMethod(postMethod);        } catch (HttpException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }

?

? ?? 在第二行PostMethod postMethod = new PostMethod();后面,有人说需要使用postMehtod.setRequestHeader("Content-type", "multipart/form-data"); Content-type的请求类型进行更改。但是我在使用过程没有加上这一句,查了一下httpCleint的默认Content-type是 application/octet-stream。应该是没有影响的。对于MIME类型的请求,httpclient建议全用 MulitPartRequestEntity进行包装,就是上面的用法。

2.? 参数中文的处理问题
??? httpclient的默认编码都是ISO-8859-1,那肯定就无法支持中文参数了。引用一下这篇文章:http://thinkbase.net/w/main/Wiki?HttpClient+POST+%E7%9A%84+UTF-8+%E7%BC%96%E7%A0%81%E9%97%AE%E9%A2%98 ,按照作者的说法,就可以正常解决中文编码的问题。其中最关键的是修改EncodingUtil这个类的一个方法实现。另外,FilePart和 StringPart的构造方法都有一个带编码指定的参数,为了减少问题的出现,建议所有的都带上统一的编码,包括 postMethod.getParams()。示例如下:

String url = "http://localhost:8080/HttpTest/Test";         PostMethod postMethod = new PostMethod(url);                  StringPart sp = new StringPart("TEXT", "testValue", "GB2312");         FilePart fp = new FilePart("file", "test.txt", new File("./temp/test.txt"), null, "GB2312");                  postMethod.getParams().setContentCharset("GB2312");         MultipartRequestEntity mrp= new MultipartRequestEntity(new Part[]{sp, fp}, postMethod                 .getParams());         postMethod.setRequestEntity(mrp);                  //执行postMethod         HttpClient httpClient = new HttpClient();         try {            httpClient.executeMethod(postMethod);        } catch (HttpException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }
?







不多说了,直接上示例:

A服务器:

?msURL为:http://192.168.7.203:8080
?
Java代码

  1. /**   2.      * 发送文件到另一台服务器B   3.      *     4.      * @param File file 附件   5.      * @param serviceType服务类型   6.      * @param spId id   7.      * @return   8.      */     9.     public String sendApply(File file, String serviceType, String spId) {    10.         String fromAgentResult = "";    11.         HttpClient client = new HttpClient();    12.         PostMethod filePost = new PostMethod(msUrl+"?serviceType="+serviceType+"&spId="+spId+"&type=menu");    13. //       MultipartPostMethod filePost = new MultipartPostMethod(msUrl);    14.         // 若上传的文件比较大 , 可在此设置最大的连接超时时间     15.          client.getHttpConnectionManager(). getParams().setConnectionTimeout(8000);      16.     17.         try {    18.     19.             FilePart fp = new FilePart(file.getName(), file);    20.             MultipartRequestEntity mrp= new MultipartRequestEntity(new Part[]{fp}, filePost.getParams());    21.             filePost.setRequestEntity(mrp);    22.     23.             //使用系统提供的默认的恢复策略    24.             filePost.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,    25.                 new DefaultHttpMethodRetryHandler());    26.     27.             int httpStat = client.executeMethod(filePost);    28.             System.out.println("httpStat----"+httpStat);    29.             if (!(httpStat == HttpStatus.SC_OK)) {    30.                 fromAgentResult = "connected fail:" + httpStat;    31.             } else if (httpStat == HttpStatus.SC_OK) {    32.                     33.                 try {    34.                     DocumentBuilderFactory factory = DocumentBuilderFactory    35.                             .newInstance();    36.                     DocumentBuilder builder = factory.newDocumentBuilder();    37.                     Document doc = builder    38.                             .parse(filePost.getResponseBodyAsStream());    39.                     doc.normalize();    40.                     // NodeList optypeNL= doc.getElementsByTagName("optype");    41.                     NodeList resultNL = doc.getElementsByTagName("result");    42.                     // fromAgentOptype=    43.                     // optypeNL.item(0).getFirstChild().getNodeValue();    44.                     fromAgentResult = resultNL.item(0).getFirstChild()    45.                             .getNodeValue();    46.                     System.out.println("发送请求完毕,接收状态:"+fromAgentResult);    47.                 } catch (Exception e) {    48.                     e.printStackTrace();    49.                 }    50.             }    51.         } catch (HttpException e) {    52.             // TODO Auto-generated catch block    53.             e.printStackTrace();    54.         } catch (IOException e) {    55.             // TODO Auto-generated catch block    56.             e.printStackTrace();    57.         }    58.         filePost.releaseConnection();    59.         return fromAgentResult;    60.     }  
?
  1. /**   2.      * 发送文件到另一台服务器B   3.      *     4.      * @param File file 附件   5.      * @param serviceType服务类型   6.      * @param spId id   7.      * @return   8.      */     9.     public String sendApply(File file, String serviceType, String spId) {    10.         String fromAgentResult = "";    11.         HttpClient client = new HttpClient();    12.         PostMethod filePost = new PostMethod(msUrl+"?serviceType="+serviceType+"&spId="+spId+"&type=menu");    13. //       MultipartPostMethod filePost = new MultipartPostMethod(msUrl);    14.         // 若上传的文件比较大 , 可在此设置最大的连接超时时间     15.          client.getHttpConnectionManager(). getParams().setConnectionTimeout(8000);      16.     17.         try {    18.     19.             FilePart fp = new FilePart(file.getName(), file);    20.             MultipartRequestEntity mrp= new MultipartRequestEntity(new Part[]{fp}, filePost.getParams());    21.             filePost.setRequestEntity(mrp);    22.     23.             //使用系统提供的默认的恢复策略    24.             filePost.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,    25.                 new DefaultHttpMethodRetryHandler());    26.     27.             int httpStat = client.executeMethod(filePost);    28.             System.out.println("httpStat----"+httpStat);    29.             if (!(httpStat == HttpStatus.SC_OK)) {    30.                 fromAgentResult = "connected fail:" + httpStat;    31.             } else if (httpStat == HttpStatus.SC_OK) {    32.                     33.                 try {    34.                     DocumentBuilderFactory factory = DocumentBuilderFactory    35.                             .newInstance();    36.                     DocumentBuilder builder = factory.newDocumentBuilder();    37.                     Document doc = builder    38.                             .parse(filePost.getResponseBodyAsStream());    39.                     doc.normalize();    40.                     // NodeList optypeNL= doc.getElementsByTagName("optype");    41.                     NodeList resultNL = doc.getElementsByTagName("result");    42.                     // fromAgentOptype=    43.                     // optypeNL.item(0).getFirstChild().getNodeValue();    44.                     fromAgentResult = resultNL.item(0).getFirstChild()    45.                             .getNodeValue();    46.                     System.out.println("发送请求完毕,接收状态:"+fromAgentResult);    47.                 } catch (Exception e) {    48.                     e.printStackTrace();    49.                 }    50.             }    51.         } catch (HttpException e) {    52.             // TODO Auto-generated catch block    53.             e.printStackTrace();    54.         } catch (IOException e) {    55.             // TODO Auto-generated catch block    56.             e.printStackTrace();    57.         }    58.         filePost.releaseConnection();    59.         return fromAgentResult;    60.     }  
?



?

B服务器接收:

?
Java代码

   1. boolean bl = false;     2.     System.out.println("接收文件开始--------------");     3.     String serviceType = request.getParameter("serviceType");     4.     String spId = request.getParameter("spId");     5.     String type = request.getParameter("type");     6.     if (type.equals("menu")) {     7.      8.         DiskFileUpload fu = new DiskFileUpload();     9.         fu.setSizeMax(1000000);    10.     11.         List fileItems;    12.     13.         try {    14.             fileItems = fu.parseRequest(request);    15.             Iterator itr = fileItems.iterator();    16.             while (itr.hasNext()) {    17.                 FileItem fi = (FileItem) itr.next();    18.     19.                 if (!fi.isFormField()) {    20.                     System.out.println("\nNAME: " + fi.getName());    21.                     System.out.println("SIZE: " + fi.getSize());    22.                     try {    23.                         String newFileName = msu.updateName(Integer    24.                                 .parseInt(serviceType), spId);    25.                         System.out.println("newFileName---------------"    26.                                 + newFileName);    27.                         File fNew = new File(applyFilePath, newFileName);    28.                         fi.write(fNew);    29.                         bl = msu.acceptApply(Integer.parseInt(serviceType),    30.                                 spId, newFileName);    31.     32.                         System.out.println(fNew.getAbsolutePath());    33.     34.                     } catch (Exception e) {    35.                         // TODO Auto-generated catch block    36.                         e.printStackTrace();    37.                     }    38.                 } else {    39.                     System.out.println("Field =" + fi.getFieldName());    40.                 }    41.             }    42.     43.         } catch (FileUploadException e1) {    44.             // TODO Auto-generated catch block    45.             e1.printStackTrace();    46.         }    47.     }  
?


boolean bl = false;        System.out.println("接收文件开始--------------");        String serviceType = request.getParameter("serviceType");        String spId = request.getParameter("spId");        String type = request.getParameter("type");        if (type.equals("menu")) {            DiskFileUpload fu = new DiskFileUpload();            fu.setSizeMax(1000000);            List fileItems;            try {                fileItems = fu.parseRequest(request);                Iterator itr = fileItems.iterator();                while (itr.hasNext()) {                    FileItem fi = (FileItem) itr.next();                    if (!fi.isFormField()) {                        System.out.println("\nNAME: " + fi.getName());                        System.out.println("SIZE: " + fi.getSize());                        try {                            String newFileName = msu.updateName(Integer                                    .parseInt(serviceType), spId);                            System.out.println("newFileName---------------"                                    + newFileName);                            File fNew = new File(applyFilePath, newFileName);                            fi.write(fNew);                            bl = msu.acceptApply(Integer.parseInt(serviceType),                                    spId, newFileName);                            System.out.println(fNew.getAbsolutePath());                        } catch (Exception e) {                            // TODO Auto-generated catch block                            e.printStackTrace();                        }                    } else {                        System.out.println("Field =" + fi.getFieldName());                    }                }            } catch (FileUploadException e1) {                // TODO Auto-generated catch block                e1.printStackTrace();            }        }
?


Java代码

?? 1. //下面是返回执行结果 ?

//下面是返回执行结果

Java代码

   1.   msu.responseToAS(response, bl);     2.   System.out.println("接收申请处理完毕,状态:" + bl);     3.   return null;    msu.responseToAS(response, bl);  System.out.println("接收申请处理完毕,状态:" + bl);  return null;
?


Java代码

?? 1. //msu.responseToAS ?

//msu.responseToAS

Java代码

public void responseToAS(HttpServletResponse response, boolean synSuccess) {  2.   try {  3.    PrintWriter out = response.getWriter();  4.    if (synSuccess)  5.     out  6.       .println("<?xml version="1.0" encoding="UTF-8"?><root><result>ok</result></root>");  7.    else  8.     out  9.       .println("<?xml version="1.0" encoding="UTF-8"?><root><result>fail</result></root>");  10.   } catch (IOException e) {  11.    e.printStackTrace();  12.    System.out.println("responseToAS--error");  13.   }  14.  }  
?

?

热点排行