我需要从C#代码.Net 4.5
对控制器进行webApi调用我的Api控制器看起来像:
[Route("api/GetData/{id}/{createDate}")]
public List<DataModel> GetData(int id, DateTime createDate)
{
var dataDb = new DataDb(SqlConnectionString);
var result = dataDb .GetSalesData(id, createDate);
return result;
}
如何使用c#调用上述控制器, 我不想在url中传递参数,例如“http://wks337:8989/api/GetData/1/2013-06-11/12337”而是将其添加到标题/正文(任何最佳方法)而不是Uri。
我尝试使用HttpWebRequest:
string serviceUrl = url + methodName + "//";
dynamic parameterObj = new ExpandoObject();
parameterObj.id= definitionId;
parameterObj.createDate= jobDate;
string strParameter = JsonConvert.SerializeObject(parameterObj);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(serviceUrl);
request.ContentType = "application/json; charset=utf-8";
request.Method = "POST";
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
streamWriter.Write(parameters);
streamWriter.Flush();
streamWriter.Close();
}
var httpResponse = (HttpWebResponse)request.GetResponse();
但它总是让我404错误。 我知道我正在做某事或完全错误,任何人都可以引导我找到正确的代码。
我试过google但是示例建议在Url中传递我不想要的参数。
答案 0 :(得分:3)
这里的问题是你的控制器方法是Get[HttpGet]
方法和你的调用代码
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(serviceUrl);
request.ContentType = "application/json; charset=utf-8";
request.Method = "POST";
您正在提出"POST"
请求。如果你想让参数进入请求体而不是url。您需要制作行动方法[HttpPost]
。首先创建一个模型类,将参数捆绑为
public class GetDataParameters
{
Public int Id {get; set;},
public DateTime createDate {get; set;}
}
然后在控制器中
[Route("api/GetData/")]
[HttpPost]
public List<DataModel> GetData([FromBody] getDataParameters)
{
var dataDb = new DataDb(SqlConnectionString);
var result = dataDb .GetSalesData(getDataParameters.id, getDataParameters.createDate);
return result;
}
现在您应该可以通过在正文中传递参数来发布帖子请求。另外,作为一个建议,而不是编写所有代码,你的自己提出请求看看HastyApi甚至更好RestSharp
答案 1 :(得分:1)
你可以试试这个
使用HttpClient
using (var client = new HttpClient())
{
//My Custom Class
var request = new CreateAppRequest()
{
userAgent = "myAgent",
};
var response = await client.PostAsync("https://domain.com/CreateApp",
new StringContent(JsonConvert.SerializeObject(request),
Encoding.UTF8, "application/json"));
}
使用
提供Nuget包httpclient
和Newtonsoft
安装包Microsoft.AspNet.WebApi.Client
// HTTP POST
var gizmo = new Product() { Name = "Gizmo", Price = 100, Category = "Widget" };
response = await client.PostAsJsonAsync("api/products", gizmo);
if (response.IsSuccessStatusCode)
{
// Get the URI of the created resource.
Uri gizmoUrl = response.Headers.Location;
}
答案 2 :(得分:0)
您的操作路由指定参数作为URL的一部分传递。如果你想确保参数在体内传递,那么你需要装饰你的方法:
[Route("api/GetData")]
[HttpPost]
public List<DataModel> GetData(int id, DateTime createDate)
{
var dataDb = new DataDb(SqlConnectionString);
var result = dataDb .GetSalesData(id, createDate);
return result;
}
调用api
答案 3 :(得分:0)
有时很难理解潜在的问题。捕获Web异常并检查来自服务器的响应对象。它可能会揭示下面的实际错误。
catch (WebException e)
{
using (WebResponse response = e.Response)
{
HttpWebResponse httpResponse = (HttpWebResponse) response;
Console.WriteLine(httpResponse.StatusCode);
using (Stream data = response.GetResponseStream())
using (StreamReader reader = new StreamReader(data))
{
string text = reader.ReadToEnd();
Console.WriteLine(text);
}
}
}