【问题标题】:HttpWebRequest GET with object as parameter以对象为参数的 HttpWebRequest GET
【发布时间】:2020-01-17 08:46:39
【问题描述】:

我正在尝试从 Windows 服务调用 API。 API 是用 ASP MVC 编写的。到目前为止,我正在创建类似这样的请求:

private List<T> GetCollectionFromApi<T>(string url)
    {
        List<T> result = new List<T>();

        try
        {
            var request = (HttpWebRequest) WebRequest.Create(url);
            request.Method = "GET";

            using (var response = (HttpWebResponse) request.GetResponse())
            {
                using (var stream = response.GetResponseStream())
                {
                    using (var sr = new StreamReader(stream))
                    {
                        result.AddRange(JsonConvert.DeserializeObject<List<T>>(sr.ReadToEnd()));
                    }
                }
            }
        }
        catch (Exception e)
        {
            // handle err
        }

        return result;
    }

这一切都很好,但现在我需要在我的 GET 请求中传递一个参数。该参数是一个对象,而不是原始类型。

我是否在查询字符串中逐个属性地解构它?还是我以某种方式将其添加到请求标头?我确实计划依赖 API 控制器中的 DefaultModelBinder。任何计划都将不胜感激。

【问题讨论】:

  • 我有同样的情况,并通过使用POST方法解决它并将对象放入请求内容。不幸的是,我没有找到正确的方法来使用请求标头
  • 这就是我询问 GET 的原因 :)
  • 这样您就可以将其解构为查询字符串。但是,它将需要具有与对象属性相对应的参数的控制器方法。并且每次在对象类中添加|删除属性时,您都必须修改控制器方法。
  • “但现在我需要通过我的 GET 请求传递一个参数” - 显示接受此请求的控制器,否则我们不能说什么。另外,不要使用 HttpWebRequest,使用 HttpClient。
  • 如果是GET请求,一般只使用查询字符串参数即可。亚历山大的回答完美地说明了这一点。

标签: c# asp.net-mvc http-headers httpwebrequest http-get


【解决方案1】:

API 端:

您需要在 API 操作中使用 [FromUri] 属性。

有关参数绑定的更多信息,请查看此link

public class SomeData
{
    public int Start { get; set; } 
    public int End { get; set; }
}
public SomeController : ApiController
{
    public HttpResponseMessage Get([FromUri] SomeData data) { ... }
}

客户端

您需要像往常一样在查询中发送参数。

http://localhost/api/Some?Start=0&End=10

还有一个更有趣的链接是here

【讨论】:

    【解决方案2】:

    你的对象是这样的吗?那么列表中有多个属性还是什么?

    public class RootObject
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
        public object Attachment { get; set; }
    }
    

    如果是这样,您可以使用 Json.Convert 对其进行序列化。之后,您将获得一个字符串,您可以随请求传递什么。对象具体是什么。是来自asp mvc的授权吗?如果是这样,您很可能需要 OAuth 访问令牌。

    希望对你有帮助

    【讨论】:

    • 有点帮助。是的,它是一个简单的对象,只有几个属性。但我仍然不知道把那个 JSON 放在哪里?在请求头中?
    • 不,您不想在 GET 请求中发送 JSON 字符串。
    • @CodeCaster 你是对的,我的错。感谢您的回复。
    【解决方案3】:

    我更喜欢用RestSharp处理所有的休息请求。它也会解决你的问题。

    正如记者提到的,该对象将具有很少的属性,而无需对 API 控制器进行任何更改即可按照以下方式完成。

    var request = new RestRequest(url).AddParameter("paramName", "paramValue", ParameterType.GetOrPost);
    

    您可以通过以下方式获得结果:

    IRestResponse response = client.Execute(request);
    

    client 是处理所有请求/响应活动的 RestClient 类。

    【讨论】:

    • 这不是一个答案,它是一个图书馆的链接。解释你将如何使用 RestSharp 解决这个问题。
    • ParameterType.UrlSegment - 所以你决定 OP 现在为这些参数使用路由?
    • @CodeCaster,我刚刚给了他提示,因此它有多种方法可以将参数附加到请求中。它也有 ParameterType.GetOrPost 。有关详细信息,请参阅文档。
    • @CodeCaster,我的示例中的代码示例将 110% 解决记者的问题
    • 不,不会。 OP 有一个他们想要向其发送数据的 API,但他们不知道他们想如何接受数据。您的答案假设他们希望通过路由(您使用ParameterType.UrlSegment)。当然,RestSharp 过去可能已经帮助您解决了类似的问题,但这不是同一个问题。
    猜你喜欢
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 2016-03-17
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2019-06-09
    相关资源
    最近更新 更多