以 object 作为参数的 HttpWebRequest GET
HttpWebRequest GET with object as parameter
我正在尝试从 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 请求中传递一个参数。该参数是 object,而不是原始类型。
我是否在查询字符串中通过 属性 解构它 属性?或者我是否以某种方式将其添加到请求 header?我确实计划依赖 API 控制器中的 DefaultModelBinder。任何计划将不胜感激。
你的对象是这样的吗?那么列表中有多个属性吗?
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序列化它。之后,您将获得一个字符串,您可以随请求传递什么。具体是什么对象。是aspmvc的授权吗?如果是这样,您很可能需要 OAuth 访问令牌。
希望对您有所帮助
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
还有一个更有趣的link细节是here。
我更喜欢用 RestSharp 处理所有休息请求。而且它会解决你的问题。
正如记者所提到的,对象的属性比不对 API 控制器进行任何更改的情况下可以通过以下方式完成的属性少。
var request = new RestRequest(url).AddParameter("paramName", "paramValue", ParameterType.GetOrPost);
你可以通过 :
得到结果
IRestResponse response = client.Execute(request);
其中 client 是 RestClient
class 处理您所有的 request/response activity.
我正在尝试从 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 请求中传递一个参数。该参数是 object,而不是原始类型。
我是否在查询字符串中通过 属性 解构它 属性?或者我是否以某种方式将其添加到请求 header?我确实计划依赖 API 控制器中的 DefaultModelBinder。任何计划将不胜感激。
你的对象是这样的吗?那么列表中有多个属性吗?
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序列化它。之后,您将获得一个字符串,您可以随请求传递什么。具体是什么对象。是aspmvc的授权吗?如果是这样,您很可能需要 OAuth 访问令牌。
希望对您有所帮助
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
还有一个更有趣的link细节是here。
我更喜欢用 RestSharp 处理所有休息请求。而且它会解决你的问题。
正如记者所提到的,对象的属性比不对 API 控制器进行任何更改的情况下可以通过以下方式完成的属性少。
var request = new RestRequest(url).AddParameter("paramName", "paramValue", ParameterType.GetOrPost);
你可以通过 :
得到结果IRestResponse response = client.Execute(request);
其中 client 是 RestClient
class 处理您所有的 request/response activity.