使用 angular 执行 GET 传递复杂对象

Doing a GET passing a complex object with angular

我正在使用 AngularJs 和资源模块。我想做一个 GET 来获取一个对象。要执行这个 GET,我不必简单地将 ID 传递给服务器,但我应该传递一个具有不同属性和值的复杂对象..

这里是我使用的代码:

$scope.getActivationStatus = function (event) {
    event.preventDefault();

    if ($scope.segui_attivazione_form.$valid) {
        $scope.activationStatus =
            new SeguiAttivazioneService
                .seguiAttivazione()
                .$get(
                    {
                        request: $scope.activationStatus
                    }, function () { });
    }
};

在服务器端我有:

[HttpGet]
public IHttpActionResult GetActivationStatus(MyComplexObject request)
{
    //I will do something here later...
    return Ok();
}

问题是 "request" 到达服务器时等于 NULL... 我已经解决了将两个字符串传递给服务器的问题......以这种方式:

$scope.getActivationStatus = function (event) {
    event.preventDefault();

    if ($scope.segui_attivazione_form.$valid) {
        $scope.activationStatus =
            new SeguiAttivazioneService
                .seguiAttivazione()
                .$get(
                    {
                        codiceFiscale: $scope.activationStatus.CodiceFiscale,
                        codiceRichiesta: $scope.activationStatus.CodiceRichiesta
                    }, function () { });
    }
};

服务器端:

[HttpGet]
public IHttpActionResult GetActivationStatus(string codiceFiscale, string codiceRichiesta)
{
    return Ok();
}

以这种方式一切正常...但我不喜欢这个解决方案,因为我将有两个以上的输入... 这是获取,而不是 post(不是保存,更新)...

如何通过 GET 传递复杂对象?

谢谢...

如果要在请求的body中发送数据,最好使用POST方式。虽然可以使用 Angular,但某些服务器可能会忽略 GET 请求的主体。

请求正文只能由POST发送。使用 get,您最多可以 URL 对 OBJECT 进行编码,然后将其作为查询字符串参数发送。但这不是 post 一些数据到服务器

的最佳解决方案

这种方法允许发送带有数组和子对象的复杂对象:

Angular:

$http({
       url: '/myApiUrl',
       method: 'GET',
       params: { param1: angular.toJson(myComplexObject, false) }
      })

C#:

[HttpGet]
public string Get(string param1)
{
     Type1 obj = new JavaScriptSerializer().Deserialize<Type1>(param1);
     ...
}

这不是一个优雅的解决方案,但它可以使用 HTTP GET:

$http.get(url + "?" + $.param(obj).replace(/%5b([^0-9].*?)%5d/gi, '.'))

它将复杂的对象转换成一个字符串,用点符号来定义级别。大多数服务器端框架,如 ASP.NET Core 都可以将其绑定到复杂的对象。

这是我为复杂对象发送的字符串示例:

开始日期=2021-06-11&结束日期=2021-06-11&TimeRange.TimeFrom.Time=07%3A00&TimeRange.TimeFrom.Time帧=AM&TimeRange.TimeTo.Time=10%3A00&TimeRange.TimeTo.Time帧=上午