2013-03-28 4 views
0

Я пишу поставщик аутентификации в .Net как службу REST, чтобы упростить вызов с PHP и iOS. Я использовал библиотеки MVC Web API, и все работает отлично, я могу вызывать методы из браузера и т. Д.Вызов. Net Web API от cURL

НО, когда я пытаюсь вызвать метод POST из cURL с помощью curl -d "something = something" hxxp : // myendpoint/api данные, переданные в теле сообщения с -d, не интерпретируются для соответствия методам в моем классе Web API, и я не вижу, как получить доступ к этим полям типа формы.

Я не могу изменить вызов curl, потому что он исходит из сторонней библиотеки и кажется правильным, но, хотя я понимаю, что веб-API по дизайну соответствует только параметрам uri для действий, я не понимаю, почему я могу " т получить доступ к данным формы из объекта запроса (или, может быть, я могу?)

[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? Должен ли я писать классы селектора пользовательских действий?

+0

У вас есть доступ к коду .NET и PHP-коду? –

+0

Я вижу код PHP, но это не мой код для изменения. У меня есть код .Net. – Lukos

ответ

0

Это то, что я использую для работы с CURL в PHP:

$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 принять строки запроса менее URLs. Например, вы могли бы настроить маршрут, как это:

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

Что касается послепечатной обработки данных от локона, вы должны увидеть тип содержимого, отправляемый из скручиваетесь и обрабатывать данные надлежащим образом.

+0

Это то, что делает cURL. Мне нужно заставить его работать на другом конце. – Lukos

+0

Я обновил свой ответ, чтобы включить некоторые ASP.NET MVC 3. Как данные отправляются с PHP и cURL? Это JSON, XML или некоторая строка с разделителями? –

+0

Данные cURL кодируются по URL-адресу, потому что я тестирую его из командной строки, у меня нет проблем с вызовом в MVC, а просто с проблемой доступа к опубликованным данным из запроса. Другими словами, только маршруты по умолчанию, похоже, заботятся о параметрах в querystring, поэтому я могу вызывать только действие без параметров или одно со сложными типами (которые по умолчанию являются необязательными), но когда я вызываю любой из них, быть чем-то вроде Request.Form – Lukos

0

Я нашел то, что мне нужно, это что-то вроде этого:

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

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

В основном, запрос и, видимо, все рамки Web API является асинхронным, который это хорошо, но это требует несколько больше строк чтобы заставить его работать. Я предполагаю, что мне нужно ждать данных, поскольку ReadAsFormDataAsync может не завершиться к моменту достижения следующей строки кода. Кроме того, мне нужно проверить, есть ли опубликованный тип и т. Д., Чтобы исключить исключения, когда я их не хочу.

Смежные вопросы