我正在从我的角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"}
你可以试试这个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;
}
}]);
终于想通了。
我必须添加一个多解析器bean。
@Configuration
public class WebConfig extends WebMvcAutoConfiguration {
@Bean
public MultipartResolver multipartResolver() {
return new CommonsMultipartResolver();
}
}
这解决了问题。似乎当我把它作为spring boot应用程序运行时,spring已经处理好了,但是当它作为WAR文件部署时,应该配置这个bean
我想你错过了@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告诉我,响应仍然是带有对象的对象,我猜问题就在那里