【问题标题】:Heroku HttpServlet: doGet() is being called instead of doPost()Heroku HttpServlet:正在调用 doGet() 而不是 doPost()
【发布时间】: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,放入正文,然后发送。我会用我的邮递员的样子来编辑。
  • 你能解决这个问题吗?
  • 用核弹解决了这个问题。

标签: java http servlets heroku


【解决方案1】:

发送 POST 请求

要发送带有相关数据的 POST 请求,请按以下步骤操作:

  • 确保选择了 Normal 选项卡,这是默认选项。

  • 提供请求 URL。请务必将实际值放在 URL 中,因为 curl 语句中使用的环境变量不会在此处定义。

  • 选择 POST 作为选定的 HTTP 方法。

  • 单击 Headers 按钮,并提供 Header - 值对 Content-Type - application/json。

  • 单击 URL 参数按钮。对于参数配置,首先选择 raw,然后从下拉列表中选择 JSON。

  • 将配置 JSON 粘贴到提供的区域。

  • 单击发送。 (如果您最近提交了请求,您可能不会被要求再次进行身份验证。)您将看到一个弹出窗口来输入您的凭据。这样做并单击确定。

更多信息在这里: Use Postman for HTTP Requests

【讨论】:

  • 在发送 POST 请求后,我的帖子已更新为响应的 SS。
  • @JonathanChiou,您在请求中发送了什么?值,JSON 字符串?
  • 我正在发送 JSON。
  • { name : "Dood", about_me : "I am cool.", village : "Bettany", zip_code : 94538, phone_number: "55555555555", email: "derp@durdle.com" }
  • 问题不在于字符串;问题是 doPost() 即使是 POST 请求也不会执行。字符串本身不会改变这一点。
猜你喜欢
  • 1970-01-01
  • 2014-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 2011-08-18
  • 2012-04-18
相关资源
最近更新 更多