【问题标题】:Rest GET request in C# with body在 C# 中使用正文休息 GET 请求
【发布时间】:2020-05-15 07:01:05
【问题描述】:

我正在尝试向 REST API 发出带有正文的 GET 请求 - 没有成功。 API 位于 Elastisearch 之上,它需要一个请求主体。 正文包含请求的特定字段的过滤器和请求。 我在 Postman 中尝试了多个不同的请求,它们工作正常。转发正文并按预期过滤结果。

API 是状态运行的,这意味着我无法控制它。 它拒绝任何不是 GET(POST、PUT 等)的请求。

我尝试过使用 RestSharp,但它拒绝使用正文发出 GET 请求。 错误消息是:“Http 动词 GET 不支持正文”。 (我试图从 Postman 获取 C# 代码,但它引发了相同的异常)。

我也尝试过使用 HttpClient、HttpWebRequest 和 WebClient。他们都犯了同样的错误。 为了尝试一个新平台,我创建了一个从 C# 运行的 PowerShell 脚本,但它引发了相同的异常。

这在 C# 中是不可能的吗?

我现在唯一的选择是创建例如可以成功查询 API 的 PHP(或其他语言)脚本,然后从 C# 访问此脚本。但这似乎只是一个解决方法,只是因为 GET/body 问题。

您可以提供或推荐给我的任何建议或资源将不胜感激!谢谢。

顺便说一句。我在 Stackoverflow 上看到了很多关于这个问题的帖子。他们中的许多人都很老了,所以我希望也许有些事情已经改变了。他们中的许多人最终都得到了一个使用 POST 而不是 GET 的解决方案——这对我来说不是一个选择。

【问题讨论】:

标签: c# rest elasticsearch


【解决方案1】:

您可以使用 NEST (https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/nest.html) - 用于 .net 的弹性客户端

示例代码:

var elasticUrls =  new Uri[]{new Uri("http://localhost:9200") };
            var connect = new ConnectionSettings(
                    new SniffingConnectionPool(elasticUrls, true, null),
                    (builtin, settings) =>
                        new JsonNetSerializer(
                            builtin,
                            settings,
                            null,
                            null,
                            new JsonConverter[] {new StringEnumConverter()})
                );

var client = new ElasticClient(connect);

var searchResult = await client.SearchAsync<ElasticModel>(
                d => d
                    .Query(q => q.Bool(qd => qd
                        .Must(m => m.MatchAll())
                    ))
                    .From(0)
                    .Size(10)
            ).ConfigureAwait(false);

    /// <summary>
    /// Some model from Elastic
    /// </summary>
    class ElasticModel
    {
        public int Id { get; set; }
    }

【讨论】:

    【解决方案2】:

    使用 RestSharp,在 request.AddParameter 中使用 ParameterType.GetOrPost 而不是 ParameterType.RequestBody

    request.AddParameter("application/json", "things", ParameterType.GetOrPost);
    

    【讨论】:

    • 最新版本的 RestSharp (106) 给出错误消息 - “HTTP 动词不支持正文”
    猜你喜欢
    • 2020-09-20
    • 2017-01-27
    • 2022-01-25
    • 2019-08-03
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    相关资源
    最近更新 更多