【问题标题】:Blazor HTTPRequestMessage with several named parameters具有多个命名参数的 Blazor HTTPRequestMessage
【发布时间】:2021-01-08 19:12:31
【问题描述】:

使用最新版本的 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, etc...}");

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

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

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

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

【问题讨论】:

  • “黑匣子”到底是什么意思?这项服务有任何文件吗?它是一个 API - 期待数据 - 还是另一个期待“表单提交”的 Web 应用程序 (HTML)?是 POST、PUT 还是其他?那么反应呢?根据黑盒的预期参数,HttpClient有合适的方法。
  • 无 API,它是一个 Web 应用程序,希望用户填写表单并点击提交按钮,然后显示结果表。我想以编程方式执行此操作。这是一个 GET 请求。在我有疑问是否必须序列化 8 个或 9 个参数之前没有这样做,如果它们必须是所有字符串等。

标签: blazor blazor-server-side http-request-parameters


【解决方案1】:

如果您必须与这样的“旧版”应用程序进行交互,正如您在评论中提到的那样,第一步是分析向应用程序发送的请求,即提交表单的请求。通常,您可以“猜测”它是基于表单输入的名称。但是,有时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);
    }

GET 附加 URL

    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 应用程序中的模型可能与您发送到旧版应用程序的模型不同。如有必要,您还可以应用任何转换。因此,您可以用 NameOfLegacyProperty 替换 nameof(ItemModel.Name) 之类的内容以使其正常工作。

【讨论】:

  • 谢谢。它有很大帮助。我还没有实施这些更改。我确实有一个问题,您在 SendDataAsGet 中显示 get 请求并将所有参数添加为 Get,它会返回我需要的结果(URL 需要单击一个按钮)对于 Post 的相同问题,在这两种情况下您正在“填充” URL 表单,但响应是否包含“按钮单击响应”?
  • 响应将是旧版应用程序返回的任何内容。如果您在旧版应用程序中单击按钮,您将被重定向到新页面,指示操作成功/失败?有优秀的 HTML 解析器库可用,例如 AngleSharp。使用这些库,您可以查询文档以获取诸如 class="success" 或任何指示操作结果的内容。如果您愿意,我可以在回复中添加一个示例。
  • 再次感谢您,它确实有效,我已经提高了投票率,但它没有公开显示
  • 我很高兴能提供帮助。声誉是一个很好的副作用,但不是目标 :) 接受答案(如果可能的话)也可以帮助其他人找到解决方案。
【解决方案2】:

谢谢,你帮我完成了我的项目

【讨论】:

    猜你喜欢
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 2023-04-10
    • 1970-01-01
    • 2012-05-20
    • 2011-01-03
    相关资源
    最近更新 更多