java.io.IOException:服务器返回的HTTP响应代码:405的URL

我有一个servlet在线,我正在尝试联系,以便做一些基本的testing。 这是servlet代码:

import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class index extends HttpServlet { private static final long serialVersionUID = 1L; public index() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); long time1 = System.currentTimeMillis(); long time2 = time1 + 10000; out.println(time1); long i = 400000000l; while (System.currentTimeMillis() < time2) { i++; } out.print(time2); } } 

现在,我试图从服务器使用以下代码获取信息:

 import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; public class HttpRequest { public static void main(String args[]) { BufferedReader rd; OutputStreamWriter wr; try { URL url = new URL("http://blahblahblah/index"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); wr = new OutputStreamWriter(conn.getOutputStream()); wr.flush(); conn.setConnectTimeout(50000); rd = new BufferedReader( new InputStreamReader(conn.getInputStream())); String line; while ((line = rd.readLine()) != null) { System.out.println(line); } } catch (Exception e) { System.out.println(e.toString()); } } } 

但是我一直得到相同的405错误。 我究竟做错了什么?

你看到的是HttpServletdoPost()的默认实现,因为你没有在你的index servlet中override它。

 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String protocol = req.getProtocol(); String msg = lStrings.getString("http.method_post_not_supported"); if (protocol.endsWith("1.1")) { resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg); } else { resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg); } } 

立即发送405响应。

这是因为你打电话

 conn.getOutputStream() 

这使得URLConnection认为你默认发送一个POST ,而不是你期待的GET 。 你甚至没有使用OutputStream所以为什么打开它,然后flush()它,并再也不会使用它了?

 wr = new OutputStreamWriter(conn.getOutputStream()); wr.flush(); 

您也可以检查请求方法是GET还是POST:

 private static final int READ_TIMEOUT = 100000; private static final int CONNECT_TIMEOUT = 150000; public static final String POST = "POST"; public static final String GET = "GET"; public static final String PUT = "PUT"; public static final String DELETE = "DELETE"; public static final String HEAD = "HEAD"; private URL url = null; private HttpURLConnection conn = null; private OutputStream os = null; private BufferedWriter writer = null; private InputStream is = null; private int responseCode = 0; private String request(String method, String url, List<NameValuePair> params) throws IOException { if(params != null && method == GET){ url = url.concat("?"); url = url.concat(getQuery(params)); } this.url = new URL(url); conn = (HttpURLConnection) this.url.openConnection(); conn.setReadTimeout(READ_TIMEOUT); conn.setConnectTimeout(CONNECT_TIMEOUT); conn.setRequestMethod(method); conn.setDoInput(true); conn.setDoOutput(true); if(params != null && method == POST){ os = conn.getOutputStream(); writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); writer.write(getQuery(params)); writer.flush(); writer.close(); os.close(); } conn.connect(); responseCode = conn.getResponseCode(); is = conn.getInputStream(); String contentAsString = getStringFromInputStream(is); return contentAsString; } private String getQuery(List<NameValuePair> params) throws UnsupportedEncodingException { StringBuilder result = new StringBuilder(); boolean first = true; for (NameValuePair pair : params){ if (first){ first = false; } else { result.append("&"); } result.append(URLEncoder.encode(pair.getName(),"UTF-8")); result.append("="); result.append(URLEncoder.encode(pair.getValue(),"UTF-8")); } return result.toString(); }