Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 未调用API Http get方法_C#_Asp.net Mvc_Api_Http_Http Get - Fatal编程技术网

C# 未调用API Http get方法

C# 未调用API Http get方法,c#,asp.net-mvc,api,http,http-get,C#,Asp.net Mvc,Api,Http,Http Get,我创建了简单的API,如下所示: 公共类TestController:ApiController{ [HttpGet,路由(“ProductData”)] 公共IHttpActionResult产品数据(int id){ 试一试{ 列表产品=新列表(){ 新产品(){Name=“TestProduct”,Id=“001”,Quantity=“15-001”}, 新产品(){Name=“TestProduct”,Id=“002”,Quantity=“15-002”}, 新产品(){Name=“Te

我创建了简单的API,如下所示:

公共类TestController:ApiController{
[HttpGet,路由(“ProductData”)]
公共IHttpActionResult产品数据(int id){
试一试{
列表产品=新列表(){
新产品(){Name=“TestProduct”,Id=“001”,Quantity=“15-001”},
新产品(){Name=“TestProduct”,Id=“002”,Quantity=“15-002”},
新产品(){Name=“TestProduct”,Id=“003”,Quantity=“15-003”},
新产品(){Name=“TestProduct”,Id=“004”,Quantity=“15-004”},
新产品(){Name=“TestProduct”,Id=“005”,Quantity=“15-005”},
};
返回Ok(products.Where(product=>product.Id==Id.ToString())。选择(product=>product.FirstOrDefault());
}
抓住{
投掷;
}
}
}
我从控制台使用此服务,如下所示:

HttpClient-HttpClient=new-HttpClient();
httpClient.BaseAddress=新Uri(“http://localhost:64672/");
httpClient.DefaultRequestHeaders.Accept.Add(新的System.Net.Http.Headers.MediaTypeWithQualityHeaderValue(“应用程序/json”));
HttpResponseMessageGetData=httpClient.GetAsync(“api/Test/ProductData”,135)。结果;
if(getProductData.IsSuccessStatusCode){
var message=postMessage.Content.ReadAsStringAsync().Result;
WriteLine(“来自API的消息:{0}”,Message.Replace(',','.ToString());
}
但我并没有从API中得到输出,相反,IsSuccessStatusCode为false,请有人在这方面帮助我

从浏览器调用时,我收到以下错误:

<Error> 
    <Message> No HTTP resource was found that matches the request URI 'localhost:64672/api/Test/ProductData?id=120'. 
    </Message> 
    <MessageDetail> No action was found on the controller 'IdsApp' that matches the name 'ProductData'. 
    </MessageDetail> 
</Error>

未找到与请求URI“localhost:64672/api/Test/ProductData?id=120”匹配的HTTP资源。
在控制器“IdsApp”上未找到与名称“ProductData”匹配的操作。

您应该在api控制器操作中使用
[FromRoute]
属性装饰
int id
。因此,将
int-id
更改为
[FromRoute]int-id
。同时将
Route(“ProductData”)
更改为
Route(“ProductData/{id}”)
。最后,修改
GetAsync()
uri如下:

var getData = httpClient.GetAsync($"api/Test/ProductData/{135}").Result;

你仍然可以使用你的路线,但你必须做一点不同

HttpResponseMessage getData = httpClient.GetAsync(string.Format("api/Test/ProductData?id={0}", 135)).Result;

正如其他人所说,这与您如何设置路由有关

您需要决定是否希望您的URI看起来像

api/Test/ProductData?id={0}

就我个人而言,我认为第二条看起来更好,因为这样你就可以在其上连锁其他路线

api/Test/ProductData/{productId}/store/{storeID}
在该示例中,从storeId的特定存储中提取productId的产品

归根结底,这取决于个人偏好,即您希望如何构造URI

如何设置第二个选项是通过更改方法上方的route属性,如下所示:

[HttpGet]
[Route("ProductData/{id}")]
public IActionResult ProductData(int id)
{
 .....Whatever code
}

就个人而言,我不喜欢将所有属性放在同一个方括号中,但这只是我自己编写代码的风格。更喜欢将属性分开,我只是觉得更容易阅读

您的路由是否在
WebApiConfig
文件中指定
api/
?不要使用
.Result
来阻止异步方法。使您自己的方法
async
并使用
wait
。至于出了什么问题,实际的错误是什么?状态代码是什么?如果你得到了404,可能是因为你使用了错误的URL。
Route(“ProductData”)
中没有
api
。您是否尝试过调用
Test/ProductData
?你试过在浏览器或邮递员中键入URL吗?@dunnel123是的mentioned@PanagiotisKanavos-我试着通过控制台打电话。用什么?无法使用CLI命令进行HTTP调用。您至少必须使用
curl
。你尝试了什么,得到了什么?那么首先是什么错误呢?404? 这是一个错误的URL。401还是403?身份验证/授权错误。500? 服务器将提供有关响应的更多详细信息。未找到与请求URI“”匹配的HTTP资源。在控制器“IdsApp”上未找到与名称“ProductData”匹配的操作。这是我从浏览器中呼叫时收到的错误检查修改后的答案。看起来不错,我的错误在路由属性中,我更正了,它成功了,谢谢你response@It看起来不错,我的错误在路由属性中,我更正了,它成功了,谢谢你response@It看起来不错,我的错误是在路由属性中,我纠正了这个错误,它成功了,谢谢您宝贵的回复
[HttpGet]
[Route("ProductData/{id}")]
public IActionResult ProductData(int id)
{
 .....Whatever code
}