我正在尝试使用API设置Asp.Net表单站点。 我已经成功添加了选择性身份验证,因此启动“\ api \”的页面不会被重定向,而是挑战基本身份验证。 我现在正在尝试使用MS Web Api 2来进行API路由。
我们的想法是尽可能地保持RESTful。我有一个资源,一个TradableItem,最初我想让API用户以两种方式之一使用HTTP GET。
如果API用户未传递任何项密钥,则用户会收到可能的项密钥列表
<div class="panel-footer">
Like <span class="glyphicon glyphicon-thumbs-up"></span>
<a href='javascript:void(0)' onClick="javascript:toggle<?php echo $idp?>()" style="color:black">Comments</a>
<div id='toggleComment<?php echo $idp;?>' style="display:none;">
<form action="" method="POST"><!--FORM COMMENT-->
<div class="form-group">
<div class="rows" >
<div class="col-sm-1" style="padding-right:2px;">
<div class="compic">
<img src="<?php echo $profilepic; ?>" style="width:100%;height:100%;" />
</div>
</div>
<div class="col-sm-11" style="padding-left:3px; padding-bottom:7px">
<textarea class="form-control expandable pull-left" name="comment<?php echo $idp;?>" id="comment" placeholder="Write a comment..." required>
</textarea>
</div>
</div>
<hr>
<button type="submit" class="btn btn-primary pull-right" name="subcom<?php echo $idp;?>"><b>Comment</b></button>
<div class="clearfix"></div>
</div></form>
<div class="rows" >
<?php
$postid=$idp;
$postby=$id;
$postto=$uid;
if(isset($_POST['subcom'.$postid]))
{ $postbody=$_POST['comment'.$postid];
if($postbody!="")
{$res=mysqli_query($con,"INSERT INTO comment VALUES('','$postby','$postto','$postbody','$postid')");}
}
$show=mysqli_query($con,"SELECT * FROM comment WHERE postid='$idp' ORDER by id");
while($show_row=mysqli_fetch_array($show))
{
$commentbyid=$show_row['cby'];
$combody=$show_row['cbody'];
$cbyquery=mysqli_query($con,"SELECT * FROM user WHERE id='$commentbyid'") or die(mysqli_error($con));
$cby=mysqli_fetch_array($cbyquery);
$cpic=$cby['profpic'];
if ($cpic== "" || !file_exists("userdata/profile_pics/$cpic"))
{
$cpic = "images/default_pic.jpg";
}
else
{
$cpic = "userdata/profile_pics/".$cpic;
}
$cname=ucfirst(strtolower($cby[1]));
$csname=ucfirst(strtolower($cby[2]));
?>
<div class="col-sm-1" style="padding-right:2px;">
<div class="compic">
<img src="<?php echo $cpic; ?>" style="width:100%;height:100%;" />
</div>
</div>
<div class="col-sm-11" style="padding-left:3px;">
<?php echo $cname." ".$csname;?><br>
<?php echo $combody;?>
</div>
<?php
}
?></div>
</div><!--Toggle Ends here-->
</div>
如果API用户将项密钥作为URI的一部分传递,例如“/ api / tradables / abc”,则返回具有key = ABC的TradableItem的表示。 (据我了解,这是标准的REST行为)。
在Global.ASAX的Application_Start()函数中,我有一个像这样的路由图......
["ABC","DEF"...]
TradableController.cs文件看起来像这样......
RouteTable.Routes.MapHttpRoute(
name: "TradableItemVerbs",
routeTemplate: "api/tradables/{item}",
defaults: new { item = System.Web.Http.RouteParameter.Optional, controller = "Tradable" });
问题是只有GetKeys()函数触发,无论我是将GET称为“/ api / tradables”还是“/ api / tradables / abc”。
供参考,使用VS2015社区,IIS 7.5,目标.Net 4.6.1。我使用Rick Strahl的博客作为此指南(以及其他来源)。
http://weblog.west-wind.com/posts/2012/Aug/21/An-Introduction-to-ASPNET-Web-API#HTTPVerbRouting
答案 0 :(得分:1)
请将您的param的名称更改为item(因为,这是路径中定义的名称):
public string GetTradable(string item)
{
....
}
或当您使用参数名称明确调用方法时: / api / tradables?pkey = abc