我正在尝试向带有json数组的spring控制器发出HTTP POST请求。我收到了404回复。我已经完成了以下教程:
但无论我尝试什么,我总会得到同样的错误。我使用Spring v3.0.5作为我的项目。
"NetworkError: 404 Not Found -
http://127.0.0.1:8080/projectmvc/arttestresults/addsearchqueries"
我的jQuery代码如下:
$.ajax({
url: '/projectmvc/arttestresults/addsearchqueries',
type: 'POST'
context: document.body,
dataType: 'json',
data: {'searchQueries': JSON.stringify([{'appName': 'myAppName', 'searchQuery': 'query # 1'}]}
}).done(function(data) {
var dataObject;
try {
dataObject = jQuery.parseJSON(data);
} catch (err) {
dataObject = data;
}
// HTML escape.
// See https://github.com/janl/mustache.js/blob/master/mustache.js#L52
var entityMap = {
"&": "&",
"<": "<",
">": ">",
'"': '"',
"'": ''',
"/": '/'
};
var escapeHtml = function(input) {
return String(input).replace(/[&<>"'\/]/g, function (s) {
return entityMap[s];
});
};
// Messages
$('#message').text('Success');
}).fail(function(jqXhr, textStatus, errorThrown) {
$('#message').text('Error');
});
我的控制器代码:
@RequestMapping(method=RequestMethod.POST, value="/arttestresults/addsearchquery")
@ResponseStatus(HttpStatus.OK)
public void addSearchQuery(HttpServletRequest request) {
String searchQueryString = request.getParameter("searchQueries");
Gson gson = new Gson();
Type collectionType = new TypeToken<List<ArtSearchQueryRequest>>(){}.getType();
List<ArtSearchQueryRequest> searchQueries =
gson.fromJson(searchQueryString, collectionType);
// Insert the search queries
}
呈现JSP的控制器函数
@RequestMapping(method=RequestMethod.GET, value="/arttestresults/showaddsearchqueryform.html")
public String showAddSearchQuery(Model model) {
ArtSearchQueryRequest request = new ArtSearchQueryRequest();
request.setAppName(APPNAME);
model.addAttribute("searchQueryRequest", request);
return "addsearchqueries";
}
JSP页面
<!DOCTYPE html>
<html>
. . .
</head>
<body>
<div class="container">
<div id="message" class="units-2 column" style="left:50%; top: 5%; position:fixed">
</div>
<div class="column-group">
<div class="units-2 column">
<h4>Add Search Queries</h4>
</div>
</div>
<!-- Add the form inside this. -->
<div class="column-group">
<div class="units-2 column">
<form modelAttribute="searchQueryRequest" method="POST"
action="${pageContext.request.contextPath}/arttestresults/addsearchquery">
<div class="form-group">
<label for="appNameHidden" class="hide">App Name</label>
<form:hidden path="appName" id="appNameHidden" htmlEscape="true"></form:hidden>
</div>
<div class="form-group">
<label for="searchQuery">Search Query</label>
<input type="text" maxlength="100"name="searchQuery"
placeholder="Enter your search query here.">
<span><a href="#">Add more queries.</a></span>
</div>
<button class="button" type="button">Submit</button>
</form>
</div>
</div>
</div>
<%@ include file="/WEB-INF/views/scripts.jsp" %>
<script type="text/javascript">
$('form button').on('click.submit.queries', function(event) {
event.preventDefault();
$('form input[type=text]').makeSearchCall({
url: '${pageContext.request.contextPath}/arttestresults/addsearchqueries',
type: 'POST',
appName: 'crawler'
})
});
</script>
</body>
</html>
请求永远不会到达控制器。
更新日志如下:
POST http://localhost:8080/projectmvc/arttestresults/addsearchquery 404 Not Found 5ms
NetworkError: 404 Not Found - http://localhost:8080/projectmvc/arttestresults/addsearchquery"
我尝试使用请求正文请求映射,如下所示
@RequestMapping(method=RequestMethod.POST, value=arttestresults/addsearchquery)
@ResponseStatus(HttpStatus.OK)
public void addSearchQuery(@RequestBody final String requestBodyString) {
String searchQueryString = request.getParameter("searchQueries");
Gson gson = new Gson();
Type collectionType = new TypeToken<List<ArtSearchQueryRequest>>(){}.getType();
List<ArtSearchQueryRequest> searchQueries =
gson.fromJson(searchQueryString, collectionType);
// Insert the search queries
}
更新#2 Http Fox Post Request返回以下内容
data: "[{"appName":"crawler","searchQuery":"test1"},{"appName":"crawler","searchQuery":"test2"},{"appName":"crawler","searchQuery":"test3"},{"appName":"crawler","searchQuery":"test4"}]"
答案 0 :(得分:0)
在解决404错误问题时,我通常会遵循以下步骤:
如果请求和数据是我期待的,我检查服务器日志。通常它会让你知道发生了什么。通常它是以下之一:
大多数这些都很容易从日志中收集。为避免遇到控制器映射问题,我使用Spring
MockMVC
进行控制器的单元测试 - 以这种方式调试问题要容易得多。
如果其他一切都失败了,我打开调试器,看看到底发生了什么。
答案 1 :(得分:0)
您在AJAX请求中发送的数据是一个对象数组。但@RequestBody映射到String - 不确定这是否正确。
我已经看到json映射层中抛出的异常被包装为404错误。找出实际异常的最好方法是添加相关的弹簧源(我认为spring web和webmvc应该足够了),添加一些断点并进行调试。
答案 2 :(得分:0)
@RequestMapping(value =“/ something”,headers =“Accept = application / json”,method = RequestMethod.POST)
答案 3 :(得分:-1)
如果在项目中使用了spring security,那么您应该在ajax请求中添加csrf令牌。 This answer包含详细信息。