【问题标题】:Calling .Net Web API from cURL从 cURL 调用 .Net Web API
【发布时间】:2013-03-28 18:48:12
【问题描述】:

我正在.Net 中编写一个身份验证提供程序作为 REST 服务,以便更轻松地从 PHP 和 iOS 调用。我使用了 MVC Web API 库,一切正常,我可以从浏览器等调用方法。

但是当我尝试使用 curl -d "something=something" hxxp://myendpoint/api 从 cURL 调用我的 POST 方法时,使用 -d 在消息正文中传递的数据不会被解释匹配我的 Web API 类中的方法,我看不到如何访问此表单类型字段。

我无法更改 curl 调用,因为它来自第 3 方库并且似乎是正确的,但尽管我知道 Web API 的设计仅将 uri 参数与操作匹配,但我不明白为什么我不能从 Request 对象访问表单数据(或者我可以?)

[HttpPost] public AccessToken Post() {} // Matches but can't access form data
[HttpPost] public AccessToken Post2(string something) {} // Doesn't match, no parameter in curl uri querystring
[HttpPost] public AccessToken Post3(ModelWithOnePropertyCalledSomething data) {} //Matches but can't access form data

这真的是 Web API 无法实现的吗?我必须编写自定义动作选择器类吗?

【问题讨论】:

  • 您可以访问 .NET 代码和 PHP 代码?
  • 我可以看到 PHP 代码,但这不是我要更改的代码。我拥有 .Net 代码。

标签: php asp.net rest curl asp.net-web-api


【解决方案1】:

这是我在 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" }
            );

就处理来自 cURL 的帖子数据而言,您需要查看从 cURL 发送的内容类型并适当地处理数据。

【讨论】:

  • 这是 cURL 已经在做的事情。我需要让它在另一端工作。
  • 我已更新我的答案以包含一些 ASP.NET MVC 3。如何从 PHP 和 cURL 发送数据?是 JSON、XML 还是一些分隔字符串?
  • cURL 中的数据是 url 编码的,因为我正在从命令行对其进行测试,调用 MVC 没有问题,只是从请求中访问发布的数据时出现问题。换句话说,默认路由似乎只关心查询字符串上的参数,所以我只能调用无参数操作或具有复杂类型的操作(默认情况下是可选的)但是当我调用其中任何一个时,似乎没有类似于 Request.Form
【解决方案2】:

我找到了我需要的东西,它是这样的:

[HttpPost]
    public AccessToken Post2()
    {
        var data = Request.Content.ReadAsFormDataAsync();
        data.Wait();
        var form = data.Result;

        return new AccessToken() { Value = "" };
    }

基本上,请求和显然所有的 web api 框架都是异步的,这很好,但需要多几行代码才能使其工作。我猜我需要等待数据,因为 ReadAsFormDataAsync 在我到达下一行代码时可能还没有完成。我还需要检查发布的类型等,以避免出现我不想要的异常。

【讨论】:

    猜你喜欢
    • 2021-09-24
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多