【问题标题】:POST on JAVA Restful WebService URL from JavaScriptPOST 来自 JavaScript 的 JAVA Restful WebService URL
【发布时间】:2013-04-30 10:33:03
【问题描述】:

我已经在 java 中实现了一个 RESTful web 服务,它将数据插入 MySQL db,我已经在 mozila firefox 和 google chrome 中使用 POSTER 对此进行了测试。我的 Web Service 使用 POST 请求的字符串,现在我无法使用 JS 使用 WEB SERVICE:在 WEB SERVICE URL 上发出 POST 请求的代码如下:

$.ajax({
            url: 'http://localhost:8080/AgentWS/webresources/Items',
            type: 'POST',
            contentType: 'application/xml',
            dataType: 'xml',
            data: 'content='+content,
            success: function (data) {
            alert(content);

            },
            error: function(XMLHttpRequest, textStatus, errorThrown) { 
            alert("Error: " + errorThrown); 
}
        });

成功功能中的警报也没有显示,而且对话框错误显示一个对话框:错误:就可以了

服务器端代码是:

@POST
@Consumes("application/xml")
@Produces("application/xml")
public String postXml(String content) {
    //TODO
    // return Response.created(context.getAbsolutePath()).build();
    StringTokenizer sp = new StringTokenizer(content, "&");

    String agentName = sp.nextToken();
    String agentId = sp.nextToken();
    String agentState = sp.nextToken();
    String agentExtension = sp.nextToken();
    String agentDeviceState = sp.nextToken();
    String agentDeviceStateChangeTime = sp.nextToken();
    DBConection conn = new DBConection();
    conn.insertAgentActivityInfo(agentName, agentId, agentState, agentExtension, agentDeviceState, agentDeviceStateChangeTime);

    return agentName + " " + agentId + " " + agentState + " " + agentExtension + " " + agentDeviceState + " " + agentDeviceStateChangeTime;
}

【问题讨论】:

  • 您面临的错误是什么?通过提及您在跑步时遇到的错误来提问是一种很好的做法。
  • 我已经编辑了@Joshi 的问题
  • 用萤火虫(或类似的)调试它。检查发送的请求、HTTP 响应代码和响应。如果错误确实是服务器端的,请检查您的 java 应用程序中的错误日志。

标签: java javascript web-services rest


【解决方案1】:

我认为问题在于您发送的数据,

data: 'content='+content 应替换为参数的名称,如

data: {content:'content='+content}

并检查您在服务器端正在做什么

【讨论】:

    【解决方案2】:

    我的猜测是data: 'content='+content, 正在向服务器发布无效的 XML,而您收到 500 内部服务器错误。您可以尝试将 data 设置为 XML 内容吗?喜欢

    ...
    data: content,
    ....
    

    编辑

    如果你想要的只是一个简单的帖子

    Java

    @POST
    public String postXml(String content) {
      //TODO
      // return Response.created(context.getAbsolutePath()).build();
      StringTokenizer sp = new StringTokenizer(content, "&");
    
      String agentName = sp.nextToken();
      ...
    
      return agentName + " " + agentId + " " + agentState + " " + agentExtension + " " + agentDeviceState + " " + agentDeviceStateChangeTime;
    }
    

    Javascript

    $.ajax({
      url: '/AgentWS/webresources/Items',
      type: 'POST',
      data: 'content=1&2&3&4&5&5',
      success: function (data) {
        alert(data);
    
      },
      error: function(XMLHttpRequest, textStatus, errorThrown) { 
        alert("Error: " + errorThrown); 
      }
    });
    

    【讨论】:

    • 内容变量中包含xml字符串'
    • 更有理由不破坏 XML 帖子,因为服务器会看到无法解析为有效 XML 的 content=<?xml version="1.0"....
    • 我刚刚编辑了我的 POST 到问题的服务器端代码'
    • 您根本没有使用 xml 内容...您只是想将& 分隔的字符串传递给服务器。你在哪里使用xml?
    • 是的,这就是我正在做的事情,但我仍然无法做到这一点,尽管我已经使用海报和休息控制台做到了这一点
    【解决方案3】:

    这是我的想法,你应该像这样在服务器端编写一个模型类代理:

    import javax.xml.bind.annotation.XmlRootElement;
    
    
    @XmlRootElement
    public class Agent
    {
    private String agentName;
    private String agentId; 
    private String agentState; 
    private String agentExtension; 
    private String agentDeviceState; 
    private String agentDeviceStateChangeTime;
    
    public String getAgentName() {
        return agentName;
    }
    public void setAgentName(String agentName) {
        this.agentName = agentName;
    }
    public String getAgentId() {
        return agentId;
    }
    public void setAgentId(String agentId) {
        this.agentId = agentId;
    }
    public String getAgentState() {
        return agentState;
    }
    public void setAgentState(String agentState) {
        this.agentState = agentState;
    }
    public String getAgentExtension() {
        return agentExtension;
    }
    public void setAgentExtension(String agentExtension) {
        this.agentExtension = agentExtension;
    }
    public String getAgentDeviceState() {
        return agentDeviceState;
    }
    public void setAgentDeviceState(String agentDeviceState) {
        this.agentDeviceState = agentDeviceState;
    }
    public String getAgentDeviceStateChangeTime() {
        return agentDeviceStateChangeTime;
    }
    public void setAgentDeviceStateChangeTime(String agentDeviceStateChangeTime) {
        this.agentDeviceStateChangeTime = agentDeviceStateChangeTime;
    }
    }
    

    你的服务器休息服务应该稍​​微改变一下:

    @POST
    @Consumes("application/xml")
    @Produces("application/xml")
    public String postXml(Agent agent) {}
    

    在此方法中,您可以使用传递的“代理”对象来检索客户端发送的所有值,例如agent.getAgentName()

    现在应该包含如下内容的有效负载(或请求正文):

    <Agent>
    <agentName></agentName>
    <agentId></agentId>
    <agentState></agentState>
    <agentExtension></agentExtension>
    <agentDeviceState></agentDeviceState>
    <agentDeviceStateChangeTime></agentDeviceStateChangeTime>
    </Agent>
    

    希望对你有所帮助。

    【讨论】:

      【解决方案4】:

      没有错误代码和消息很难猜到,但是:

      改变

      data: 'content='+content
      

      data: { content : content } // format as json
      

      在你的 java 资源中:

      @POST
      @Consumes(MediaType.APPLICATION_JSON)
      public String postXml(String content)
      // read content as json
      

      【讨论】:

        猜你喜欢
        • 2013-08-09
        • 1970-01-01
        • 2014-12-02
        • 2016-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-08
        • 2013-12-09
        相关资源
        最近更新 更多