【问题标题】:Send Get and POST request to Azure function app using ajax .NET使用 ajax .NET 向 Azure 函数应用发送 Get 和 POST 请求
【发布时间】:2021-06-11 10:56:36
【问题描述】:

我正在开发一个 .NET 应用程序,用户可以在其中填写请求(表单)。一旦用户点击“提交”。目标是将 POST 请求发送到函数应用(由 PowerShell 驱动)。如果 post 请求成功,它将返回请求的 id。

我想使用此 ID 来查询发送到函数应用的请求 (GET) 的状态。一旦用户点击提交,它应该自动将他们重定向到详细信息页面,在那里他们可以查看他们的请求状态。

这是我要将请求路由到的控制器:

namespace AzDeployManager.Web.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class DeploymentController : ControllerBase
    {

        public string ReceiveRequest { get; set; }
        public string CheckRequest { get; set; }

        public DeploymentController(IOptions<AppSettings> settings)
        {
            this.ReceiveRequest = settings.Value.AzReceiveRequest;
            this.CheckRequest = settings.Value.AzCheckRequest;
        }

        // POST: api/ReceiveRequest
        [HttpPost]
        [Route("sendrequest")]
        public async Task<IActionResult> OnPostAsync([FromBody] Deployment deployment)
        {
            using var http = new HttpClient();
            var data = new Deployment
            {
                
            };

            //var content = new StringContent(JsonConvert.SerializeObject(deployment));

            var content = new StringContent(JsonConvert.SerializeObject(data));
            content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

            var request = http.PostAsync(ReceiveRequest, content);

            var response = await request.Result.Content.ReadAsStringAsync();

            return Ok(response);
        }
    }
}

在控制器中显示的 http 帖子中,我可以通过调试查看数据。我现在在根据需要自定义有效负载时遇到问题:

{
   "data": {
       "name1": "val1",
       "name2": "val2"
   },
   "name3": "val3"
}

任何指导都会在这里有所帮助。

【问题讨论】:

  • 您的 Azure 函数如何调用?你用的是哪个触发器?
  • Azure 函数使用 http 触发器(post),一旦请求进入,它会将请求定向到相应的队列,只要其接受的有效负载主体。
  • 如果要等待响应,不需要使用 Azure 功能。如果您只是通过 azure 函数在 db 中添加数据并希望等待响应,那么为什么不从应用程序本身保存数据呢?如果您没有任何选择,那么您可以使用 httpclient (c-sharpcorner.com/article/…) 调用您的函数,但您无法以这种方式获取响应。一种选择是使用 Thread.Sleep(3000) 等待 2-3 秒,然后从 db 中获取最后一条记录,但您永远不知道函数中是否存在错误。
  • 相关函数应用处理所有数据处理。向其发送请求后,它将将该请求添加到 azure 存储表中。从 dotnet 的角度来看,我只是希望能够向这个函数应用发送有效负载请求 > 获取请求 Id 并使用这个请求 Id 在详细信息页面中获取请求的详细信息。
  • 然后查看我在上面评论中粘贴的链接。您可以使用 httpclient 来调用您的 azure 函数。

标签: asp.net-mvc asp.net-core asp.net-mvc-3 asp.net-web-api


【解决方案1】:

可以使用jQuery将表单的键值对序列化成数组,然后解析成json对象。

<script>
    function getdata() {
        var paramArray = $('#submitreq').serializeArray();

        var body = {};
        $(paramArray).each(function () {
            //here 
            if (this.name.indexOf('\.') > 0) {
                body[this.name.split('\.')[1]] = this.value;
            } else {
                body[this.name] = this.value;
            }
        });
        
        body['RequestNumber'] = parseInt(body['RequestNumber'])
        
        $.ajax({
            type: "POST",
            url: "/api/sendrequest",
            dataType: "json",
            data: JSON.stringify(body),
            contentType: "application/json; charset=utf-8",
            success: function (response) {
                console.log("Success: " + response.RequestNumber);
            },
            error: function (req, status, error) {
                console.log("Error occured: " + status + "" + req.responseText);
            }
        });
    }
</script>

由于fieldset设置为disabled,不会自动序列化,可以在fieldset外加一个隐藏的输入框。

<form id="submitreq" method="post">
  <div asp-validation-summary="ModelOnly" class="text-danger"></div>

  <input type="hidden" asp-for="Deployment.RequestNumber" class="form-control" />

<!--...-->
  <input type="button" name="name" value="submit" onclick="getdata()" />
</form>

【讨论】:

  • 我能够继续我的表单并将其路由到 api。它实际上是“api/Deployment/sendrequest”。调试后,我的控制器(根据您的 gif)看起来没有任何值,它都是空的。这里有什么指导吗?
  • 序列化时有问题吗?序列化后的捕获(序列化字符串)可以分享吗?
  • 见-imgur.com/a/GUG6kCq。我相信这可能是我的 create.cshtml.cs 文件导致了这个问题。我想将所有 GET 和 POST 请求路由到控制器以实现可重用性。
  • @bonafide,这不是视图中的jsonarray,可以分享一下你运行$('#submitreq').serializeArray()后的格式吗。
  • 访问时图片无法显示。可以转发一下吗?
猜你喜欢
  • 2015-12-07
  • 2015-07-25
  • 1970-01-01
  • 2016-08-04
  • 1970-01-01
  • 2015-07-17
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
相关资源
最近更新 更多