在向请求添加参数时,Tomcat返回400(不良请求)



我有一个奇怪的情况:

  1. 我正在使用的Web-Client应用程序基于jQuery和angularjs,

  2. 我已经部署了tomcat服务器(8.5)和servlet(基于Eclipse开发的Java)。

代码从以下内容发送请求:

var MyApp = angular.module('MyApp'); 
MyApp.factory('DB_Services', ['$http' , '$q' , function($http , $q) {
    var l_Result ;
    var DB_Services = function(p_URL_Root , p_Query) {
        var l_deferred = $q.defer();
        var l_params   = JSON.stringify(p_Query) ;
        var l_url      = "http://localhost:8080/MEKUWQDispatcher/DispatcherClass";
        var l_params   = 'request=' + encodeURIComponent(JSON.stringify(p_Query)) ;        
        var req = { url    : l_url, 
                    method :"GET", 
                    timeout:10000 , 
                    headers: { 
                        'Content-Type': 'application/json ; charset=UTF-8'
                    }, 
                    data:l_params
                  } ;
        $http(req ).
                    success(function(data, status, headers, config) {
                         l_deferred.resolve(data);
                    }).
                    error(function(data, status, headers, config) {
                         l_deferred.resolve(status);
                    });
                    return l_deferred.promise;
        return l_deferred.promise;
    } ;
    return DB_Services;
}]);

现在,servlet包括get和post方法。GET方法以两种方式工作:如果请求包含数据,则使用接收到的数据调用数据库存储过程。如果请求中没有数据,它会调用一个硬编码的选择语句(第二个行为是我发现与DB正确连接的简单方法,并且它永远不会在现实生活中激活;此外,我最终可能会从servlet的代码)。

使用浏览器时(即,铬,所有相同的结果)并输入地址:

http://localhost:8080/MEKUWQDispatcher/DispatcherClass

我获得了预期的硬编码选择语句的结果。另一方面,如果我向请求输入一些数据,则类似:

http://localhost:8080/MEKUWQDispatcher/DispatcherClass?data="request={blabla}"

我有错误400(不良请求)。

现在,切换到JavaScript,没有模式,我(有或没有数据)我总是会得到硬编码的Select语句的结果。

我还在web.xml文件中添加了servlet的声明:

<servlet>
    <servlet-name>MEKUWQDispatcher</servlet-name>
    <servlet-class>MEKUWQDispatcher.DispatcherClass</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>MEKUWQDispatcher</servlet-name>
    <url-pattern>/MEKUWQDispatcher</url-pattern>
</servlet-mapping>

由于原始帖子我对服务代码进行了几次更改,是以下新代码的副本,其工作方式如魅力(还请注意,我从GET转换为POST方法):

var MyApp = angular.module('MyApp'); 
MyApp.factory('DB_Services', ['$http' , '$q' , function($http , $q) {
    var DB_Services = function(p_URL_Root , p_Query) {
    var l_deferred = $q.defer();
    var l_params   = JSON.stringify(p_Query) ;
    var l_url      = "http://localhost:8080/MEKUWQDispatcher/DispatcherClass";
    var req = { url    : l_url, 
                method :"POST", 
                timeout:600000 , 
                headers: { 
                    'Content-Type': 'application/json ; charset=UTF-8'
                }, 
               params:{request:p_Query}
              } ;
    $http(req ).
                success(function(data, status, headers, config) {
                     l_deferred.resolve({Server_Response:data , Server_Status: status});
                }).
                error(function(data, status, headers, config) {
                     l_deferred.resolve(status);
                });
                return l_deferred.promise;
    return l_deferred.promise;
} ;
    return DB_Services;
}]);

最新更新