可选的HTTP Post参数JavaScript

时间:2016-01-29 15:02:18

标签: javascript angularjs node.js

我有一个过滤功能,很多复选框和下拉菜单。当用户选中多个复选框并选择下拉值时,他们会点击“立即过滤”按钮。

该按钮然后对我的API执行POST请求,并将过滤选项作为参数传递,并从MongoDB返回数据。

继承我的代码:

factory.getFilteredProjects = function(regions, services, sector){

  return $http.post('/user/test',{
      region: regions,
      sol: services,
      sec: sector
  }).
    success(function(data, status, headers, config) {
        // this callback will be called asynchronously
        // when the response is available

        console.log("this is the response data " + data);
    }).
    error(function(data, status, headers, config) {
        // called asynchronously if an error occurs
        // or server returns response with an error status.
    });

  };    
     return factory;
 });

在上面的代码中,您可以看到我有 3个参数 (区域,服务,部门)

现在,用户可能只希望通过以下方式过滤数据:

  1. 地区或部门
  2. Just Regions
  3. Just Services
  4. 服务和地区
  5. 等等!

    我的问题:

    如何使用POST区域传递选项参数。 目前我必须发送所有3个参数才能获取数据。如果我没有发送全部3,那么我就不会收到任何数据。 只有用户实际与之交互的数据基本上是这样的:

    // This is just to get my point across.
    function(a || b || c){
    } 
    

    更新

    通过POSTMan测试我的API。正如您所看到的,我只发送了2个参数并返回了200状态,我也得到了正确的数据。

    enter image description here

    感谢。

2 个答案:

答案 0 :(得分:1)

你可以用参数而不是三个字符串给出一个对象。像这样你可以控制POST参数的数量,而不是一些未定义。

编辑:我建议您在服务中进行过滤。像这样,您不必在每个控制器上复杂化代码:

public class SetterInterceptor {
    @RuntimeType
    public  Object intercept() {
        System.out.println("Invoked method with: ");
        return null;
    }
}

答案 1 :(得分:0)

所以在做了一些研究之后,几杯咖啡和几个发誓的话后来我开始工作了。

但是还有一张纸条:

首先感谢 Yoann Prot ,您的建议是一个巨大的帮助!

这是我最初的解决方案,我不会接受自己的答案。因为可能有更好的解决方案,如果他们认为可以改进,我希望有人发表答案/评论

所以,如果您阅读上述评论,我知道我的API能够处理多个或灵活的数字参数。问题是我的HTTP Post功能要求所有参数都存在。

Alex Blex 在评论中建议:

  

然后,您只需要检测用户实际交互的内容,并仅发送它们

这就是我所做的。

我创建了一个过滤器对象,我只添加了用户与之交互的选项的键/值对,并将整个过滤器对象作为参数传递。这使我对HTTP Post请求的参数更加灵活。

下面是代码:

 var filterObj = {};

    var form = document.getElementById("regionPicker");
    var servicesForm = document.getElementById("servicesPicker");

    var inputs = form.getElementsByTagName("input");
    var arr = [];

    var servicesInput = servicesForm.getElementsByTagName("input");
    var servicesArr = [];

    for (var i = 0;  i < inputs.length; i += 1) {
         // Take only those inputs which are checkbox
        if (inputs[i].type === "checkbox" && inputs[i].checked) {
                 arr.push(inputs[i].value);
         }
     }

    for (var i = 0;  i < servicesInput.length; i += 1) {
         // Take only those inputs which are checkbox
        if (servicesInput[i].type === "checkbox" && servicesInput[i].checked) {
                 servicesArr.push(servicesInput[i].value);
          }
       }


 // here arr contains an array of filter options selected by user
 filterObj.region = (arr.length > 0) ? arr:"";

 // here serviceArr contains an array of another filter options selected by user
 filterObj.sol = (servicesArr.length > 0) ? servicesArr:"";

最后将filterObj作为参数传递:

factory.getFilteredProjects = function(filterObj){

  return $http.post('/user/test',filterObj)
  .success(function(data, status, headers, config) {
       console.log("this is the response data " + data.length);
    })
  .error(function(data, status, headers, config) {
        // called asynchronously if an error occurs
        // or server returns response with an error status.
    });
  }; 

到目前为止,所有测试都取得了成功。但我再说一遍,如果你知道一个更好的解决方案请告诉我,或者如果你认为这个解决方案有缺点或问题,或者只是不好的做法,请告诉我。

谢谢!