Php 从cURL调用.NETWebAPI
我正在.Net中编写一个身份验证提供程序作为REST服务,以便更容易从PHP和iOS调用。我使用过MVCWebAPI库,它工作得很好,我可以从浏览器等调用方法 但是当我尝试使用cURL-d“something=something”从cURL调用POST方法时hxxp://myendpoint/api消息体中使用-d传递的数据未被解释为与我的Web API类中的方法匹配,我看不出如何访问此表单类型字段 我无法更改curl调用,因为它来自第三方库,似乎是正确的,但尽管我理解Web API在设计时只将uri参数与操作匹配,但我不理解为什么我不能从请求对象访问表单数据(或者我可以?)Php 从cURL调用.NETWebAPI,php,asp.net,rest,curl,asp.net-web-api,Php,Asp.net,Rest,Curl,Asp.net Web Api,我正在.Net中编写一个身份验证提供程序作为REST服务,以便更容易从PHP和iOS调用。我使用过MVCWebAPI库,它工作得很好,我可以从浏览器等调用方法 但是当我尝试使用cURL-d“something=something”从cURL调用POST方法时hxxp://myendpoint/api消息体中使用-d传递的数据未被解释为与我的Web API类中的方法匹配,我看不出如何访问此表单类型字段 我无法更改curl调用,因为它来自第三方库,似乎是正确的,但尽管我理解Web API在设计时只将
这真的是Web API不可能做到的吗?我必须编写自定义操作选择器类吗?这是我在PHP中用来操作cURL的:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://url/");
curl_setopt($ch, CURLOPT_USERAGENT, "Useragent");
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml; charset=UTF-8'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, "username:password");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
curl_setopt($ch, CURLOPT_POSTFIELDS, "postdata");
$data = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
我知道您可能无法修改PHP代码,但如果您可以使用PHP访问服务器,您可以尝试使用此代码查看ASP.NET MVC 3身份验证服务是否返回任何内容。然后在.NET代码中进行适当的编辑,使其在PHP中运行良好
下面是一些ASP.NET MVC 3代码示例:
[HttpGet]
public ActionResult SomeAction(string someParam)
{
return View();
}
您需要在Global.asax.cs代码中编辑路由定义,以接受查询字符串较少的URL。例如,您可以设置如下路径:
routes.MapRoute(
"API/SomeAction/SomeParam",
"api/someaction/{someParam}",
new { controller = "API", action = "SomeAction" }
);
[HttpPost]
public AccessToken Post2()
{
var data = Request.Content.ReadAsFormDataAsync();
data.Wait();
var form = data.Result;
return new AccessToken() { Value = "" };
}
至于处理来自cURL的post数据,您需要查看从cURL发送的内容类型,并适当地处理数据。我找到了我需要的内容,如下所示:
routes.MapRoute(
"API/SomeAction/SomeParam",
"api/someaction/{someParam}",
new { controller = "API", action = "SomeAction" }
);
[HttpPost]
public AccessToken Post2()
{
var data = Request.Content.ReadAsFormDataAsync();
data.Wait();
var form = data.Result;
return new AccessToken() { Value = "" };
}
基本上,请求和显然所有的web api框架都是异步的,这很好,但它需要更多的代码行才能工作。我猜我需要等待数据,因为ReadAsFormDataAsync可能在我到达下一行代码时还没有完成。我还需要检查发布的类型等,以避免出现我不希望出现的异常。您可以访问.NET代码和PHP代码?我可以看到PHP代码,但这不是我要更改的代码。我拥有.Net代码。这就是cURL已经在做的事情。我需要让它在另一端工作。我已经更新了我的答案,加入了一些ASP.NET MVC 3。如何从PHP和cURL发送数据?它是JSON、XML还是一些分隔字符串?来自cURL的数据是url编码的,因为我正在从命令行测试它,调用MVC没有问题,只是从请求中访问发布的数据有问题。换句话说,默认路由似乎只关心querystring上的参数,因此我只能调用无参数操作或具有复杂类型的操作(默认情况下是可选的),但当我调用其中任何一个时,似乎都没有类似Request.Form的内容