0

PHP や iOS から簡単に呼び出せるようにするために、REST サービスとして .Net で認証プロバイダーを作成しています。MVC Web API ライブラリを使用しましたが、すべて正常に動作し、ブラウザなどからメソッドを呼び出すことができます。

しかし、 curl -d "something=something" hxxp://myendpoint/apiを使用して cURL から POST メソッドを呼び出そうとすると、 -d を使用してメッセージ本文で渡されたデータが Web API クラスのメソッドと一致するように解釈されず、このフォーム タイプのフィールドにアクセスする方法がわかりません。

サードパーティのライブラリから来ており、正しいように見えるため、curl 呼び出しを変更できませんが、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 ではできないことですか? カスタム アクション セレクター クラスを作成する必要はありますか?

4

2 に答える 2

0

必要なものが見つかりました。次のようなものです。

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

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

基本的に、リクエストと明らかにすべての Web API フレームワークは非同期ですが、それを機能させるにはさらに数行のコードが必要です。次のコード行に到達するまでに ReadAsFormDataAsync が完了していない可能性があるため、データを待つ必要があると思います。また、不要な例外を回避するために、投稿されたタイプなどを確認する必要があります。

于 2013-04-02T10:25:12.637 に答える
0

これは、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();
}

クエリ文字列のない URL を受け入れるには、Global.asax.cs コードのルーティング定義を編集する必要があります。たとえば、次のようなルートを設定できます。

routes.MapRoute(
            "API/SomeAction/SomeParam",
            "api/someaction/{someParam}",
            new { controller = "API", action = "SomeAction" }
            );

cURL からの投稿データを処理する限り、cURL から送信されるコンテンツ タイプを確認し、データを適切に処理する必要があります。

于 2013-03-28T19:39:23.930 に答える