首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Servlet返回AngularJS2调用

Servlet返回AngularJS2调用
EN

Stack Overflow用户
提问于 2016-11-01 00:56:55
回答 1查看 791关注 0票数 0

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

代码语言:javascript
复制
"

在JSON响应中,而不是“。我在控制台中看到:

代码语言:javascript
复制
xhrstatusText: {"status":"OK"}
replaced statusTest={"status":"OK"}

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

Servlet

代码语言:javascript
复制
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呼叫

代码语言:javascript
复制
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

代码语言:javascript
复制
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呼叫

代码语言:javascript
复制
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);
    });
}
EN

回答 1

Stack Overflow用户

发布于 2016-11-01 01:04:29

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

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

代码语言:javascript
复制
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().println(jsonObj.toString());
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40346845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档