【问题标题】:java.io.IOException: Server returned HTTP response code: 405 for URLjava.io.IOException:服务器返回 HTTP 响应代码:URL 405
【发布时间】:2013-09-12 06:52:10
【问题描述】:

我有一个在线 servlet,我正在尝试联系它以进行一些基本测试。这是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 错误。我做错了什么?

【问题讨论】:

    标签: java ios servlets


    【解决方案1】:

    您也可以检查请求方法是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();
    }
    

    【讨论】:

      【解决方案2】:

      您看到的是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();
      

      【讨论】:

        猜你喜欢
        • 2013-08-12
        • 2014-08-09
        • 2011-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多