当前位置: 首页 > 知识库问答 >
问题:

Angular超文本传输协议和Spring启动Rest服务

颜高朗
2023-03-14

我正在从我的角UI调用Spring引导REST服务。只要Spring Boot Rest服务作为Spring Boot应用程序执行,它就运行良好。但是一旦我将其转换为WAR文件并部署在Jboss 6.2.4服务器上,我就会得到404。我看到来自UI的REST服务调用成功,但请求JSON没有通过。在请求JSON上,我正在传递2个字符串和一个上传的excel文件。

这是我的angular UI http调用

App.service('getHeatMapDataService', ['$http', '$q', function ($http,      $q) {
this.getHeatMapData = function (scope) {
    var url = 'http://localhost:8080/rest-services/fusiontables/upload';
    var deferred = $q.defer();
    $http({
            method: 'POST',
            url: url,
            headers: {
                'Content-Type': undefined
            },
            data: {
                stateCd: scope.stateCd,
                addressExtras: scope.addressExtras,
                uploadFile: scope.upFile
            },
            transformRequest: function (data, headersGetter) {
                var formData = new FormData();
                angular.forEach(data, function (value, key) {
                    formData.append(key, value);
                });

                var headers = headersGetter();
                delete headers['Content-Type'];
                return formData;
            }
        })
        .success(function (data) {
            deferred.resolve(data);
            console.log("Success");
            console.log(data);
        })
        .error(function (data, status) {
            deferred.reject(status);
            console.log("Failed");
        });
    return deferred.promise;
}
}]);

这是我工作时的Spring boot Rest控制器

@RequestMapping(value="/upload", method=RequestMethod.POST)
@ResponseBody
public String getBoundaries(HeatMapUploadCommand uploadCommand) {
    logger.info("Heat Map Controller invoked " + uploadCommand);
    return null;
}

这是我的上传命令

public class HeatMapUploadCommand {

private String stateCd;
private String addressExtras;
private MultipartFile uploadFile;

在我部署到Jboss之后,请求仍然会命中Spring Boot应用程序,但它的所有请求参数都为null。

这是请求负载

------WebKitFormBoundaryvCCnl3nhIgoW1MwR
Content-Disposition: form-data; name="stateCd"

CA
------WebKitFormBoundaryvCCnl3nhIgoW1MwR
Content-Disposition: form-data; name="addressExtras"

1234
------WebKitFormBoundaryvCCnl3nhIgoW1MwR
Content-Disposition: form-data; name="uploadFile"; filename="CAdata.xlsx"
Content-Type: application/vnd.openxmlformats-    officedocument.spreadsheetml.sheet


------WebKitFormBoundaryvCCnl3nhIgoW1MwR--

我试着改变控制器

@RequestMapping(value="/upload", method=RequestMethod.POST)
@ResponseBody
public String getBoundaries(@RequestParam(value="stateCd") String stateCd,
        @RequestParam(value="addressExtras") String addressExtras,
        @RequestParam(value="uploadFile") MultipartFile file) {
    System.out.println("Heat Map Controller invoked " + stateCd);
    return null;
}

还是没有运气。这是我得到的回应。

{"timestamp":1464840821648,"status":400,"error":"Bad    Request","exception":"org.springframework.web.bind.MissingServletRequestParameterException","message":"Required String parameter 'stateCd' is not     present","path":"/rest-services/fusiontables/upload"}

共有3个答案

翟昊明
2023-03-14

你可以试试这个Spring控制器方法吗

@RequestMapping(value="/upload", method=RequestMethod.POST)
@ResponseBody
public String getBoundaries(MultipartHttpServletRequest request, HttpServletResponse response) throws IOException {
    String stateCd = request.getParameter("stateCd");
    String addressExtras = request.getParameter("addressExtras");
    ......
    Iterator<String> iterator = request.getFileNames();
    while (iterator.hasNext()) {
            MultipartFile multipartFile = request.getFile(iterator.next());
            .....
    }
    .........
}

和Angular服务:

App.service('getHeatMapDataService', ['$http', '$q', function ($http,$q) {
  this.getHeatMapData = function (scope) {
    var url = 'http://localhost:8080/rest-services/fusiontables/upload';
    var deferred = $q.defer();
    var formData = new FormData();
    formData.append('stateCd', scope.stateCd);
    formData.append('addressExtras', scope.stateCd);
    formData.append('file', scope.upFile);

    $http.post( url, formData, {
        headers: { 'Content-Type': undefined },
        transformRequest: angular.identity
    }).success(function (result) {
        console.log('200');
    }).error(function () {
        console.log('400-500');
    });
    return deferred.promise;
  }
}]);
施旭东
2023-03-14

终于想通了。

我必须添加一个多解析器bean。

@Configuration
public class WebConfig extends WebMvcAutoConfiguration {
@Bean
public MultipartResolver multipartResolver() {
    return new CommonsMultipartResolver();
}

}

这解决了问题。似乎当我把它作为spring boot应用程序运行时,spring已经处理好了,但是当它作为WAR文件部署时,应该配置这个bean

法子昂
2023-03-14

我想你错过了@RequestBody。

$http与数据属性结合使用时,数据将在请求正文中传递。

$http({
    method: 'POST',
    url: url,
    data: {
        stateCd: scope.stateCd,
        addressExtras: scope.addressExtras,
        uploadFile: scope.upFile
    },

我认为,一旦你添加@RequestBody,它可能会起作用。

@RequestMapping(value="/upload", method=RequestMethod.POST)
@ResponseBody
public String getBoundaries(@RequestBody HeatMapUploadCommand uploadCommand) {
    logger.info("Heat Map Controller invoked " + uploadCommand);
    return null;
}
 类似资料:
  • 我想测试一个连接到Github api的应用程序,下载一些记录并对其进行处理。我想要一个模拟对象,我做了如下操作: 看起来不错吧?我应该在thenReturn中输入什么(它需要HttpResponse,但我不知道如何创建)。谢谢你的回答。如果你有更好的想法,我将不胜感激。 更新:字符串响应是一个示例响应

  • 我正在尝试使用Spring靴redis来存储其中的会话。当我按照他们的留档操作时,启动服务器时总是会出现异常。 到目前为止我做了什么:-我根据文档(单击)添加了所需的依赖项并创建了非常小的配置类= 因为我找不到错误,所以我使用gradle/maven导入了他们的示例项目并进行测试,我会得到或多或少相同的异常... 有人知道那个问题吗?

  • httpd是Apache超文本传输协议(HTTP)服务器的主程序。被设计为一个独立运行的后台进程,它会建立一个处理请求的子进程或线程的池。 通常,httpd不应该被直接调用,而应该在类Unix系统中由apachectl调用,在Windows NT/2000/XP/2003中作为服务运行和在Windows 95/98/ME中作为控制台程序运行. 语法 httpd [ -d serverroot ]

  • 我正在使用GWT和Spring controller来管理http流量。有些请求可能需要很长时间,但我希望在超过给定时间时终止请求。 我如何配置超时Spring。我也使用Apache Tomcat 7.0。我试图在tomcat上inrease最大线程,但有一段时间tomcat工作缓慢,因为请求线程不会死。

  • 我有一个带有nestjs后端rest api(在nodejs中)的角度(9)前端。我在后端调用的endpoint执行一些相当复杂的操作,大约需要2分钟才能响应。在前端,我使用subscribe订阅响应,如下所示: 问题是,在后端,它开始一次又一次地执行代码。请注意,它不会再次执行http调用(我可以从Developer tools中的“网络”选项卡中看到这一点),它一直处于挂起状态。如果我这样做,

  • 我目前正在与Angular2和Ionic2一起练习。我想从API检索数据(例如:https://www.cryptocompare.com/api/data/coinlist/). 要检索我使用load方法创建的提供程序中的数据,请执行以下操作: 为了显示数据,我制作了以下模板结构: 这里我使用管道,因为响应是对象。然而,我似乎不能使它工作。log告诉我,响应仍然是带有对象的对象,我猜问题就在那里