Reputation: 2183
I have a servlet online that I'm trying to contact in order to do some basic testing. This is the servlet code:
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);
}
}
Now, I'm trying to get information from the server using the following code:
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());
}
}
}
However I keep getting the same 405 error. What am I doing wrong?
Upvotes: 3
Views: 16632
Reputation: 1
You can also put a check if the request method is GET or 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();
}
Upvotes: 0
Reputation: 280132
What you are seeing is the HttpServlet
's default implementation of doPost()
, since you don't override
it in your index
servlet.
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);
}
}
which immediately sends a 405 response.
This occurs because you call
conn.getOutputStream()
which makes the URLConnection
think you are sending a POST
by default, not the GET
you are expecting. You aren't even using the OutputStream
so why open it, then flush()
it and never us it again?
wr = new OutputStreamWriter(conn.getOutputStream());
wr.flush();
Upvotes: 8