【问题标题】:Post request in javascript with Java rest api doesn't work使用Java rest api在javascript中发布请求不起作用
【发布时间】:2017-03-11 03:45:13
【问题描述】:

我有一个动态 Web 项目,我想在远程服务器上的 mysql 数据库上发送数据。 因此,我在文件libraryPersistentBean.java 中有一个带有此代码的 REST api:

public void addDemande(DemandeInscription demande) {
        Connection con = null;
          String url = "jdbc:mysql://my-ip:3306/my-database-name?useSSL=false";
          String driver = "com.mysql.jdbc.Driver";

          String userName = "my-username";
          String password = "my-password";
         // List<DemandeInscription> demandes = new ArrayList<DemandeInscription>();
          try {

             Class.forName(driver).newInstance();
             con = DriverManager.getConnection(url , userName, password);

             PreparedStatement st = 
             con.prepareStatement("insert into demandeInscription(name, city, address, food, type, email) values( ?, ?, ?, ?, ?, ?)");
             st.setString(1,demande.getName());
             st.setString(2,demande.getCity());
             st.setString(3,demande.getAddress());
             st.setString(4,demande.getFood());
             st.setString(5,demande.getType());
             st.setString(6,demande.getEmail());


          //   int result = st.executeUpdate();                

          } catch (SQLException ex) {
             ex.printStackTrace();
          } catch (InstantiationException ex) {
             ex.printStackTrace();
          } catch (IllegalAccessException ex) {
             ex.printStackTrace();
          } catch (ClassNotFoundException ex) {
             ex.printStackTrace();
          }    

    }

我在这里调用这个函数:

    @POST
@Produces(MediaType.TEXT_HTML)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public void post(@FormParam("name") String name, @FormParam("city") String city, @FormParam("address") String address, @FormParam("food") String food,
        @FormParam("type") String type, @FormParam("email") String email) throws IOException {

    DemandeInscription demande = new DemandeInscription(name, city, address, food, type, email);
    LibraryPersistentBean libraryPersistentBean = new LibraryPersistentBean();
    libraryPersistentBean.addDemande(demande);



}

还有我的 javascript 文件,我有:

function sendInscription(){
    var name = document.getElementById("name").value;
    var city = document.getElementById("city").value;
    var address = document.getElementById("address").value;
    var food = document.getElementById("food").value;
    var type = document.getElementById("type").value;
    var email = document.getElementById("email").value;

    var xhr = new XMLHttpRequest();
    xhr.open('POST', 'rest/demandes');
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

    xhr.onreadystatechange = function() {
        if(xhr.readyState == 4 && xhr.status == 200) {
            alert(xhr.responseText);
        }
    }
    xhr.send('name=' + name + '&city=' + city + '&address=' + address + '&food=' + food + '&type=' + type + '&email=' + email);

}    

所以,我没有错误,但是经过测试,我在数据库中什么都没有。 你知道为什么它不起作用吗?

【问题讨论】:

  • 我认为您的代码永远不会到达 post 方法。您应该在 xhr.open 中指定完整的 URL 路径。
  • 调试并检查当请求到达服务器时你得到了什么。
  • 我已经尝试过使用完整的 URL,它并没有改变任何东西。
  • 我不知道如何使用调试模式...

标签: javascript java mysql post xmlhttprequest


【解决方案1】:

我没有足够的评论点数,但乍一看,st.executeUpdate() 命令已被注释掉。您可能还需要做一个conn.commit();。最后,您需要在addDemande 方法的末尾添加一个conn.close();,这样您就不会泄漏连接。最好conn.close(); 应该在finally 子句中。希望这有助于为您指明正确的方向。

更新:

这是您的 addDemande(...) 方法,其中包含提交和正确关闭连接的更改。

 public void addDemande(DemandeInscription demande) {
    Connection conn = null;
    String url = "jdbc:mysql://my-ip:3306/my-database-name?useSSL=false";
    String driver = "com.mysql.jdbc.Driver";

    String userName = "my-username";
    String password = "my-password";
    // List<DemandeInscription> demandes = new ArrayList<DemandeInscription>();
    try {

        Class.forName(driver).newInstance();
        conn = DriverManager.getConnection(url, userName, password);

        PreparedStatement st = conn
                .prepareStatement("insert into demandeInscription(name, city, address, food, type, email) values( ?, ?, ?, ?, ?, ?)");
        st.setString(1, demande.getName());
        st.setString(2, demande.getCity());
        st.setString(3, demande.getAddress());
        st.setString(4, demande.getFood());
        st.setString(5, demande.getType());
        st.setString(6, demande.getEmail());

        // Turn off auto-commit 
        conn.setAutoCommit(false);

        // Uncommented this statement that actually does the update
        int result = st.executeUpdate();

        // Commit the change
        conn.commit();

        // Release the resource
        st.close();

    } catch (SQLException ex) {
        ex.printStackTrace();
    } catch (InstantiationException ex) {
        ex.printStackTrace();
    } catch (IllegalAccessException ex) {
        ex.printStackTrace();
    } catch (ClassNotFoundException ex) {
        ex.printStackTrace();
    } finally {
        if (conn != null) {
            conn.close();
        }
    }
}

【讨论】:

  • 你能告诉我我需要把这些函数(提交、关闭、执行更新)放在哪里
  • 是的,它有效。有必要取消注释 st.executeUpdate() 行。谢谢!
猜你喜欢
  • 2019-01-27
  • 2016-04-05
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 2013-12-01
  • 2017-05-25
相关资源
最近更新 更多