【发布时间】:2015-12-24 22:35:19
【问题描述】:
(Servelt 托管在 Heroku 上)
在我的 Servlet 中,我实现了创建用户的 POST 方法。即使我已将其实现为 POST 方法,但每当我使用 POST 使用 /createAccount URI 向服务器发出请求时,都会调用我的 doGet() 方法。为什么调用的是我的 doGet() 方法而不是我的 doPost() 方法?
Github 获取代码:https://github.com/jchio001/AravindsBackend/blob/master/src/main/java/Main.java
原始代码:
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.json.JSONException;
import org.json.JSONObject;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URI;
import java.net.URISyntaxException;
import java.sql.*;
public class Main extends HttpServlet{
private static String TABLE_CREATION = "CREATE TABLE IF NOT EXISTS profile (user_id SERIAL, name varchar(32), " +
"about_me varchar(1024), village varchar(32), zip_code int, phone_number varchar(16), email varchar(32));";
private static String TABLE_CREATION_2 = "CREATE TABLE IF NOT EXISTS Connections (requester_id int, target_id int, status varchar(32));";
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Connection connection = null;
try {
connection = getConnection();
Statement stmt = connection.createStatement();
stmt.executeUpdate(TABLE_CREATION);
stmt.executeUpdate(TABLE_CREATION_2);
resp.getWriter().print("I did get X.");
}
catch (Exception e) {
resp.setStatus(500);
resp.getWriter().print("Table creation error: " + e.getMessage());
}
finally {
try {
connection.close();
}
catch (SQLException e) {
resp.getWriter().print("Failed to close connection: " + getStackTrace(e));
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
Connection connection = null;
try {
connection = getConnection();
Statement stmt = connection.createStatement();
stmt.executeUpdate(TABLE_CREATION);
stmt.executeUpdate(TABLE_CREATION_2);
resp.getWriter().print("I did post.");
}
catch (Exception e) {
resp.setStatus(500);
resp.getWriter().print("Table creation error: " + e.getMessage());
}
StringBuffer jb = new StringBuffer();
String line;
try {
BufferedReader reader = req.getReader();
while ((line = reader.readLine()) != null)
jb.append(line);
}
catch (IOException e) {
resp.setStatus(400);
resp.getWriter().print("Couldn't read in request body: " + getStackTrace(e));
}
try {
JSONObject jsonObject = new JSONObject(jb.toString());
if (req.getRequestURI().endsWith("/createAccount")) {
resp.setStatus(200);
resp.getWriter().print("Creating!");
String name = jsonObject.getString("name");
String about_me = jsonObject.getString("about_me");
String village = jsonObject.getString("village");
String zip_code = jsonObject.getString("zip_code");
String phone_number = jsonObject.getString("phone_number");
String email = jsonObject.getString("email");
String update_sql = "INSERT INTO profile (name, about_me, village, zip_code, phone_number, email) VALUES (?, ?, ?, ?, ?, ?)";
try {
PreparedStatement stmt = connection.prepareStatement(update_sql);
stmt.setString(1, name);
stmt.setString(2, about_me);
stmt.setString(3, village);
stmt.setString(4, zip_code);
stmt.setString(5, phone_number);
stmt.setString(6, email);
stmt.executeUpdate();
stmt.close();
}
catch (SQLException e) {
resp.getWriter().print("SQL ERROR @POST: " + getStackTrace(e));
}
}
else {
resp.setStatus(404);
}
}
catch (JSONException e1) {
resp.setStatus(400);
resp.getWriter().print("Error parsing request JSON: " + getStackTrace(e1));
}
catch (IOException e) {
resp.setStatus(500);
resp.getWriter().print("Error creating SQL statement: " + getStackTrace(e));
}
finally {
try {
connection.close();
}
catch (SQLException e) {
resp.getWriter().print("Failed to close connection: " + getStackTrace(e));
}
}
}
private static Connection getConnection() throws URISyntaxException, SQLException {
URI dbUri = new URI(System.getenv("DATABASE_URL"));
String username = dbUri.getUserInfo().split(":")[0];
String password = dbUri.getUserInfo().split(":")[1];
String dbUrl = "jdbc:postgresql://" + dbUri.getHost() + dbUri.getPath();
return DriverManager.getConnection(dbUrl, username, password);
}
public static void main(String[] args) throws Exception {
Server server = new Server(Integer.valueOf(System.getenv("PORT")));
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
server.setHandler(context);
context.addServlet(new ServletHolder(new Main()), "/*");
server.start();
server.join();
}
public static String getStackTrace(Throwable aThrowable) {
final Writer result = new StringWriter();
final PrintWriter printWriter = new PrintWriter(result);
aThrowable.printStackTrace(printWriter);
return result.toString();
}
}
编辑:我发出 HTTP 请求时 POSTMAN 的截图(包括发出相同请求所需的所有信息): http://i.imgur.com/286Boz4.png 可以看到,我的输出是“I did get X”,这意味着 doGet() 正在执行。
【问题讨论】:
-
向我们展示您提出请求的客户端代码。
-
我使用邮递员提出请求。
-
设置为 POST,输入 URL,放入正文,然后发送。我会用我的邮递员的样子来编辑。
-
你能解决这个问题吗?
-
用核弹解决了这个问题。