使用HttpWebrequest / HttpClient进行WebApi 2调用

时间:2016-01-04 10:43:14

标签: c# asp.net-web-api2 .net-4.5

我需要从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中传递我不想要的参数。

4 个答案:

答案 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")); 
 }
  

使用httpclientNewtonsoft

提供Nuget包      

安装包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;
}

msdn reference

答案 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;
}

也可以从c#HastyApiRestSharp

调用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);
                }
            }
        }