AngularJS$http://.NET Web API-获取400(错误请求)或NULL POST操作方法参数

AngularJS $http / .NET Web API - Either Getting 400 (Bad Request) or NULL POST Action Method Parameter

本文关键字:请求 错误 NULL 操作方法 POST 参数 http NET Web 获取 API-      更新时间:2023-09-26

以下是对我的问题的简要描述(我可以这样做),以及所有相关代码。我希望这篇文章的措辞会比我之前请求的帮助更清晰一些。

我有一个.NET Web API和一个AngularJS前端。我有一个非常简单的POST方法,它接受"Envelope"类型的参数,如下所示:

public class Envelope {
    public int listingId { get; set; }
    public string Description { get; set; }
    public override string ToString() {
        return listingId.ToString() + "; " + Description;
    }
}

API上的实际POST方法如下所示:

[EnableCors(origins: "http://simpleapiearl.azurewebsites.net", headers: "*", methods: "*")]
public class EnvelopesController : ApiController {
        // POST: api/Envelopes
        public string Post(Envelope env) {
            return "rval: " + env.ToString() + " (and my addition to env)";
        }
    }

我的前端AngularJS$http POST看起来像这样:

        $scope.testPOST = function () {
            var env = {
                listingId:1234,
                Description:"some desc"
            };
            $http({
                method: 'POST',
                url: 'http://simpleApiEarl.azurewebsites.net/api/envelopes',
                data: JSON.stringify(env),
                headers: {
                    'Content-Type': 'application/json'
                }
            }).
            success(function (data, status, headers, config) {
                $scope.postStatus = 'success: ' + data;
            }).
            error(function (data, status, headers, config) {
                $scope.postStatus = 'error: ' + status;
            });
        }

以下是我的问题(编号便于参考):

  1. 使用上面显示的所有代码,当我从页面中调用"testPOST()"时,我会得到一个"400(坏请求)"。这听起来像是.NET Web API路由问题,但我搞不清楚是什么问题
  2. 如果我将"内容类型"标头更改为"application/x-www-form-urlencoded",我可以避免400(事实上得到200)。但是,这会导致API将"env"参数视为NULL
  3. 我倾向于用'[FromBody]'属性修饰我的操作方法参数,但这样做并不能解决API操作方法中'env'为NULL的问题

我用我非常简单的HTML页面创建了一个简单的plunk,用来调用API。可以在这里找到:

http://plnkr.co/edit/hY2OUeg9CRQ1QOz8MGU8?p=info

非常感谢您提供的任何帮助。

"内容类型":"应用程序/x-www-form-urlencoded"

这会奏效的。

这是控制器:

public async Task<HttpResponseMessage> GetData(int pageNo, int pageSize)
    {
        HttpResponseMessage response = null;
        int totalPage, totalRecord;
        totalRecord = db.Employees.Count();
        totalPage = (totalRecord / pageSize) + ((totalRecord % pageSize) > 0 ? 1 : 0);
        var record = (from a in db.Employees
                      orderby a.id
                      select a).Skip((pageNo - 1) * pageSize).Take(pageSize).ToList();
        DataWithPaging data = new DataWithPaging
        {
            PageNo = pageNo,
            PageSize = pageSize,
            TotalPage = totalPage,
            TotalRecord = totalRecord,
            EmployeeData = record               
        };
        response = Request.CreateResponse(HttpStatusCode.OK, data);
        return await Task.FromResult(response);
    }

您应该有一个名为:DataWithPaging 的类

public class DataWithPaging
{
    public int PageNo { get; set; }
    public int PageSize { get; set; }
    public int TotalPage { get; set; }
    public int TotalRecord { get; set; }
    public List<Employee> Employees { get; set; }
}