做了一个功能,就是获取车辆的年票信息,代码如下
action里面的代码
String searchdqcph = "粤s.F3462";
String searchcx = "G";
String url = "http://www.dgsfs.net/product_search.asp?searchdqcph="+searchdqcph+"&searchcx="+searchcx;
String htmlContent = GetHttpClint.doGet(url);GetHttpClint.java的代码public static String doGet(String url) {
InputStream in ;
HttpClient client = new HttpClient();
GetMethod method = new GetMethod(url);
method.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 5000);
        StringBuffer buffer = new StringBuffer();
try {
client.executeMethod(method);
int statecode = method.getStatusCode();
if (statecode == HttpStatus.SC_OK) {
//response = method.getResponseBodyAsString();
in = method.getResponseBodyAsStream();
//System.out.println(response);
in = new BufferedInputStream(in);
        Reader r = new InputStreamReader(in,"gb2312");
        int c;
        while ((c = r.read()) != -1)
                buffer.append((char)c);
        in.close();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
method.releaseConnection();
}
return buffer.toString();
}
在执行到GetMethod method = new GetMethod(url);的代码时出错,出错信息如下2010-11-25 20:19:14 org.apache.struts.action.RequestProcessor processException
警告: Unhandled Exception thrown: class java.lang.IllegalArgumentException
2010-11-25 20:19:14 org.apache.catalina.core.ApplicationDispatcher invoke
严重: Servlet.service() for servlet action threw exception
java.lang.IllegalArgumentException: Invalid uri 'http://www.dgsfs.net/product_search.asp?searchdqcph=粤s.F3462&searchcx=G': Invalid query
at org.apache.commons.httpclient.HttpMethodBase.<init>(HttpMethodBase.java:222)
at org.apache.commons.httpclient.methods.GetMethod.<init>(GetMethod.java:89)
at front.mycar.GetHttpClint.doGet(GetHttpClint.java:37)
at front.mycar.MyCarAction.searchticket(MyCarAction.java:139)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:270)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:187)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
at org.tuckey.web.filters.urlrewrite.RewrittenUrl.doRewrite(RewrittenUrl.java:176)
at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at filter.Loginfilter.doFilter(Loginfilter.java:34)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at filter.Filter.doFilter(Filter.java:25)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)不知为什么会有这种问题出现,我看网上的例子也都是这样的,之前我做过POST的提交没出问题

解决方案 »

  1.   

    httpclient试了下,不行
    用httpwatch看了下,
    http://www.dgsfs.net/product_search.asp?searchdqcph=粤s.F3462&searchcx=G
    这个页面是能打开,
    不过返回的httpstatus是500
    不清楚是何原因
    估计是这个造成的无法获取信息
      

  2.   

    有可能,
    我按照httpwatch跟踪的所有header属性
    把urlconnection都填充了,
    也不行
    杯具
      

  3.   

    把URL先encode一下,然后调用GetMethod method = new GetMethod(url);
      

  4.   

    刚说的不准确,应该是把url里面的参数encode
      

  5.   

    String searchdqcph = "粤s.F3462";
    String searchcx = "G";
    String url = "http://www.dgsfs.net/product_search.asp?searchdqcph="+URLEncoder.encode(searchdqcph, 'utf-8')+"&searchcx="+searchcx;
    String htmlContent = GetHttpClint.doGet(url);
      

  6.   

    为何要先encode参数呢??这样我试了不行,那边网站编码是gb2312的,我换成gb2312也都不行、、
      

  7.   

    返回值是500,莫非对方服务器端报错了?在那边网站上直接操作得出的url是http://www.dgsfs.net/product_search.asp?searchdqcph=%D4%C1S.F3462&searchcx=G&Submit.x=11&Submit.y=12,,后面的“&Submit.x=11&Submit.y=12”参数不知何处来的,而我把这个url去防止httpclint里面去查一样返回的是500