首页 > 解决方案 > 具有多个命名参数的 Blazor HTTPRequestMessage

问题描述

使用最新版本的 VS 2019 Community 和 SDK 5.0.101

我创建了一个 Editform,我可以在按钮提交操作上看到模型的所有属性都有有效值。

我将 onvalidsubmit 事件的操作方法创建为异步任务在此方法中,我执行了一些自定义检查(并返回到发现任何错误的表单)。

一旦没有错误,我必须向外部站点(就像一个黑匣子)发送请求,我对它的期望和应该返回的内容有所了解。此 url 作为表单打开,因此我尝试使用获取响应所需的所有参数创建消息(即在表单上填写的所有条目),通过提交按钮检索表单上的所有条目。

我一直在寻找一个很好的例子,但找不到一个可以回答我的操作问题的例子。

以下是我到目前为止创建的步骤: var client = _clientFactory.CreateClient();

我不确定是否必须为 client.DefaultRequestHeaders.Content 添加一些值

另外,我是否需要序列化参数(json)或者我可以在调用中输入值作为 var request = new HttpRequestMessage(HttpMethod.Get,""https://theuUrlIwanttoget.com"

.com 后面需要问号吗?

我可以输入模拟json的命名参数吗(顺便说一句,不确定它们是命名的还是位置的,所以我保持在某些文档中看到的顺序)“{nameparameter1:value,nameparameter2:value,等等...}”);

值应该作为字符串“值”传递吗?不知道网站的内部工作,所以我打算试验并检查返回码

使用像 PHP 这样的另一种技术,我知道您可以将“command = submit”嵌入到参数中,它会触发 URL 表单上的提交按钮。有没有办法用 HTTPrequestmessage 来完成这个?

接下来客户端必须等待 client.PutAsync(... 我必须阅读响应。

如果有人可以指导我阅读将教我如何使用参数调用站点以便我可以继续进行的文档,我将非常感激。

标签: blazorblazor-server-sidehttp-request-parameters

解决方案


如果您必须与这样的“旧版”应用程序进行交互,正如您在评论中提到的那样,第一步是分析向应用程序发送的请求,即提交表单的请求。通常,您可以“猜测”它是基于表单输入的名称。但是,有时javascript会干扰,所以最有希望的方法是提交表单并使用浏览器开发者工具的网络选项卡(F12)。就个人而言,我喜欢 Chrome(和 Edge)显示请求的方式,但 Firefox 也没有很好的支持。

在此处输入图像描述

我喜欢在分析时在请求期间保留请求。您应该会看到请求 URL、方法和日期。

你说这是一个 GET 请求。不寻常的形式,但可能。在这种情况下,参数会附加到 URL,调试输出应该与此类似。

在此处输入图像描述

有了这些见解,我们就可以跳到 Blazor 方面。假设在 blazor 应用程序和旧应用程序中使用以下模型。

public class ItemModel
{
   public String Name { get; set; }
   public String Description { get; set; }
}

带有表单数据的 HttpPost


    public async Task SendFormData(ItemModel input)
    {
        HttpClient client = _clientFactory.CreateClient();

        String url = "<URL of your legacy app method from the network tab>";

        var values = new Dictionary<String, String>
        {
            { nameof(ItemModel.Name), input.Name  },
            { nameof(ItemModel.Description), input.Description  },
        };

        var requestContent = new FormUrlEncodedContent(values);

        var response = await client.PostAsync(url, requestContent);
    }

带有 URL 附加的 GET

    public async Task SendDataAsGet(ItemModel input)
    {
        HttpClient client = _clientFactory.CreateClient();

        String url = "<URL of your legacy app method from the network tab>";
        String urlWithValues = $"{url}?{nameof(ItemModel.Description)}={input.Name}&{nameof(ItemModel.Name)}={input.Description}";

        var response = await client.GetAsync(urlt);
    }

请记住,您在 blazor 应用程序中的模型可能与您发送到旧版应用程序的模型不同。如有必要,您还可以应用任何转换。nameof(ItemModel.Name)所以你可以用类似的东西代替NameOfLegacyProperty它来让它工作。


推荐阅读