Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.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
Php 从cURL调用.NETWebAPI_Php_Asp.net_Rest_Curl_Asp.net Web Api - Fatal编程技术网

Php 从cURL调用.NETWebAPI

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在设计时只将

我正在.Net中编写一个身份验证提供程序作为REST服务,以便更容易从PHP和iOS调用。我使用过MVCWebAPI库,它工作得很好,我可以从浏览器等调用方法

但是当我尝试使用cURL-d“something=something”从cURL调用POST方法时hxxp://myendpoint/api消息体中使用-d传递的数据未被解释为与我的Web API类中的方法匹配,我看不出如何访问此表单类型字段

我无法更改curl调用,因为它来自第三方库,似乎是正确的,但尽管我理解Web API在设计时只将uri参数与操作匹配,但我不理解为什么我不能从请求对象访问表单数据(或者我可以?)


这真的是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的内容