2013-09-08 2 views
2

У меня есть сервлет онлайн, с которым я пытаюсь связаться, чтобы выполнить базовое тестирование. Это код сервлета:java.io.IOException: Сервер вернул код ответа HTTP: 405 для URL

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. Что я делаю не так?

ответ

8

То, что вы видите, является реализация по умолчанию HttpServlet «s из doPost(), так как вы не override это в вашем index сервлета.

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(); 
+0

Спасибо, я удалил эти две строки, и она работала. – spacitron

0

Вы также можете поставить галочку, если метод запроса 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(); 
}