java - Servlet 返回 "到 AngularJS2 调用

标签 java angularjs json servlets

我正在使用 Angular2 对 servlet 进行 POST 调用。我现在必须使用 servlet。 Servlet 在响应中返回 JSON,但 Angular 将所有响应显示为失败,因为响应包含

"

在 JSON 响应中而不是“。我在控制台中看到了这一点:

xhrstatusText: {"status":"OK"}
replaced statusTest={"status":"OK"}

我不确定问题是否出在 servlet 或 Angular 调用上。

Servlet

public void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {    
    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    JsonObject jsonObj = Json.createObjectBuilder().add("status", "OK").build();
    response.setStatus(HttpServletResponse.SC_OK, jsonObj.toString());
}

Angular2 POST 调用

makeFileRequest(params: Array<string>, files: Array<File>) {
    return new Promise((resolve, reject) => {
        var formData: any = new FormData();
        var xhr = new XMLHttpRequest();

        for(var i = 0; i < files.length; i++) {
            formData.append("uploads[]", files[i], files[i].name);
        }

        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4) {
                // Contains &quot; instead of " in JSON.
                console.log('xhrstatusText: ' + xhr.statusText);
                // This fixes the JSON, but the response is already marked as failed.
                var statusTextJson = xhr.statusText.replace(/(&quot\;)/g,"\"");
                console.log('replaced statusTest=' + statusTextJson);

                if (xhr.status == 200) {
                    resolve(JSON.parse(xhr.response));
                } else {
                    reject(xhr.response);
                }
            }
        }

        xhr.open("POST", this.url, true);
        xhr.send(formData);
    });
}

!!!最终解决方案!!!

Servlet

public void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {    
    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    response.setStatus(HttpServletResponse.SC_OK);
    JsonObject jsonObj = Json.createObjectBuilder().add("status", "OK").build();
    response.getWriter().println(jsonObj.toString());
}

Angular2 POST 调用

makeFileRequest(params: Array<string>, files: Array<File>) {
    return new Promise((resolve, reject) => {
        var formData: any = new FormData();
        var xhr = new XMLHttpRequest();

        for(var i = 0; i < files.length; i++) {
            formData.append("uploads[]", files[i], files[i].name);
        }

        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4) {
                // {"status":"OK"}
                console.log('xhr.response: ' + xhr.response);

                if (xhr.status == 200) {
                    resolve(JSON.parse(xhr.response));
                } else {
                    reject(xhr.response);
                }
            }
        }

        xhr.open("POST", this.url, true);
        xhr.send(formData);
    });
}

最佳答案

根据 HttpServletResponse 的 javadoc ,由于这个原因(第二个参数的目的不明确),setStatus(int, String) 方法实际上已被弃用。它并不是真正想要做你想做的事情。

相反,考虑简单地使用 setStatus(int) 方法设置状态并将 JsonObject 写入响应的打印编写器:

response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().println(jsonObj.toString());

关于java - Servlet 返回 "到 AngularJS2 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40346845/

相关文章:

java - 我想部署在类路径中包含一些文件的 jar

java - 使用 HashMap 比较两个不同类型的列表

javascript - 转发器内的 ng 消息未出现

C# Json.NET WCF Rest 日期时间格式

java - 使用动态字段名称反序列化嵌套的 JSON 对象

java - 请求的资源不可用。 Tomcat 7.0

java - 字段出现的文档数量 - MongoDB

javascript - Angular 中使用的$$(双美元符号)是什么?

jquery - Angular 数据表列可拖出表格

ios - 没有找到与 RestKit 的可映射关系值 keyPath