在向请求添加参数时,TOMCAT返回400(错误请求)

时间:2017-03-15 14:03:37

标签: javascript angularjs tomcat servlets

我有一个奇怪的情况如下:

  1. 我正在使用的Web客户端应用程序基于JQuery和AngularJS,

  2. 我已经部署了一个TOMCAT服务器(8.5)和一个servlet(基于JAVA的Eclipse开发)。

  3. 发送请求的代码如下:

    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存储过程。如果请求中没有数据,它会调用硬编码的select语句(第二种行为是我发现的用于验证与DB的正确连接的简单方法,它在现实生活中永远不会被激活;而且,我最终可能会删除该部分servlet的代码)。

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

    http://localhost:8080/MEKUWQDispatcher/DispatcherClass
    

    我按预期得到硬编码的select语句的结果。另一方面,如果我在请求中输入一些数据,例如:

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

    我收到错误400(错误请求)。

    现在,切换到javascript,没有模式我做什么(有或没有数据)我总是得到硬编码选择语句的结果。

    我还在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>
    

1 个答案:

答案 0 :(得分:-1)

自从原始帖子以来,我对服务代码进行了几处更改,以下是新代码的副本,其工作方式像一个超级按钮(还请注意,我从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;

}]);