2015-07-03 2 views
-1

Я разработчик .NET и (время исповеди). Я никогда не использовал PHP ни для чего. Мне нужно преобразовать некоторый PHP для тестирования API. Я переделал большую часть этого, в результате чего моя ошибка насчитывала от 400 до 69, однако, чем дальше я иду, тем больше я убежден, что это просто сломается.Проблема с преобразованием некоторого PHP в C#

Итак, я решил броситься на милость своих коллег и попросить о помощи.

Что я конвертирую, это класс оболочки, который вызывает API и возвращает XML или JSON.

<?php 

class APIv2 { 
protected $accessToken; 
protected $baseURL; 
protected $functions = array(); 
protected $format = 'json'; 

public function __construct($accountid, $key, $baseURL = 'https://www.eiseverywhere.com') 
{ 
    $this->baseURL = rtrim($baseURL,'/').'/api/v2/'; 
    $request = $this->rawRequest($this->baseURL.'global/authorize.json', 
            array('accountid' => $accountid,'key' => $key)); 
    $response = json_decode($request['response'], true); 
    if (empty($response['accesstoken'])) { 
     throw new \Exception(__CLASS__.': Bad url or parameters given. '.print_r($response,1)); 
    } 
    $this->accessToken = $response['accesstoken']; 
    $response = $this->rawRequest($this->baseURL.'global/listAvailableFunctions.json', 
            array('accesstoken' => $this->accessToken)); 
    $functions = json_decode($response['response'], true); 
    foreach ($functions as $sectionName=>$section) { 
     foreach ($section as $methodName=>$functionArray) { 
      foreach ($functionArray as $functionName) { 
       $this->functions[$functionName] = array('method'=>$methodName, 'section'=>$sectionName); 
      } 
     } 
    } 
} 

public function setFormat($format) 
{ 
    $validFormats = array('xml','json'); 
    if (! in_array($format, $validFormats)) { 
     $message = __CLASS__.": Invalid format: $format. Not one of the following:"; 
     foreach ($validFormats as $value) { 
      $message .= ' '.$value; 
     } 
     throw new \Exception($message); 
    } 
    $this->format = $format; 
} 

public function request($request, $parameters = array()) 
{ 
    $parameters['accesstoken'] = $this->accessToken; 
    if (! array_key_exists($request, $this->functions)) { 
     return array(
      'response' => '', 
      'info' => $this->functions, 
      'errors' => "Unknown function: $request", 
     ); 
    } 
    $function = $this->functions[$request]; 
    $url = $this->baseURL.$function['section'].'/'.$request.'.'.$this->format; 
    return $this->rawRequest($url, $parameters, $function['method']); 
} 

public static function rawRequest($url, $parameters = array(), $method = 'get') 
{ 
    $response = 'Unable to use etouches API, please enable cURL functionality (http://php.net/curl) for your server and try again'; 
    $info = ''; 
    $errors = ''; 
    $method = strtolower($method); 
    if (function_exists('curl_init')) { 
     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); 
     $paramString = http_build_query($parameters); 
     curl_setopt($ch, CURLOPT_URL, $url . (!empty($paramString)?'?'.$paramString:'')); 
     if ($method == 'post') { 
      foreach ($parameters as &$value) { 
       if (is_array($value)) { 
        $value = http_build_query($value); 
       } 
      } 
      curl_setopt($ch, CURLOPT_POSTFIELDS, $parameters); 
     } else if ($method == 'put') { 
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
      curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Length: ' . strlen($paramString))); 
      curl_setopt($ch, CURLOPT_POSTFIELDS, $paramString); 
     } 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); 
     curl_setopt($ch, CURLOPT_TIMEOUT, 30); 
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

     $response = curl_exec($ch); 
     $info = curl_getinfo($ch); 
     $errors = curl_error($ch); 

     curl_close($ch); 
    } 
    return array(
     'response' => $response, 
     'info' => $info, 
     'errors' => $errors 
     ); 
} 

} 

function dump($h1, $var) 
{ 
    echo "<h1>$h1</h1>"; 
    var_dump($var); 
} 

$api = new etouchesAPIv2($yourAccountId, $yourAPIKey); 

$response = $api->request($call = 'listFolders'); 
$folders = json_decode($response['response'], true); 
dump($call, $folders); 

$parameters = array('name' => "New event created by etouches API", 
        'modules' => array('eHome','eMobile','eSelect','eReg','eBooth','eConnect','eSocial','eSeating'),); 
if (count($folders)) { 
    $parameters['folder'] = $folders[0]['folderid']; 
} 
$api->setFormat('xml'); 
$response = $api->request($call = 'createEvent', $parameters); 
$newEvent = new SimpleXMLElement($response['response']); 
dump($call, $newEvent); 

$api->setFormat('json'); 
$response = $api->request($call = 'listEvents'); 
$events = json_decode($response['response'], true); 
dump($call, $events); 

$api->setFormat('xml'); 
$response = $api->request($call = 'listSpeakers', array('eventid' => $events[0]['eventid'])); 
$speakers = new SimpleXMLElement($response['response']); 
dump($call, $speakers); 

$response = $api->request($call = 'getEvent', array('eventid' => $events[0]['eventid'])); 
$event = new SimpleXMLElement($response['response']); 
dump($call, $event); 

$response = $api->request($call = 'cloneEvent', array('eventid' => $events[0]['eventid'],'name'=>"Event cloned via etouches API")); 
$clonedEvent = new SimpleXMLElement($response['response']); 
dump($call, $clonedEvent); 

Где у меня проблемы, вызовы метода PHP. Я искал эквиваленты C#, насколько это возможно, но конечный результат просто некрасивый.

Итак, не могли бы вы сослаться на некоторые инструменты «PHP to C#» или ссылки на конверсии или помочь мне с CURL, __CLASS__ и другими особенностями PHP?

Следует отметить, что я изучил Phalanger и предпочел бы не использовать его, если это возможно. На данный момент я еще не нашел каких-либо комплексных инструментов для преобразования PHP или C#.

Спасибо заранее!

EDIT:

В соответствии с просьбой, вот моя попытка преобразования (.. Я знаю, это грязно, я не горжусь этим не полностью преобразуется в поток)

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web.Script.Serialization; 
using System.Net; 
using System.Diagnostics; 
using System.Xml; 

namespace Test { 
    public partial class _Default : System.Web.UI.Page { 
     protected static string accessToken; 
     protected static string baseURL; 
     protected Dictionary<string, string> functions = new Dictionary<string,string>(); 
     protected string format = "json"; 

    XmlDocument xml = new XmlDocument(); 

    protected void Page_Load(object sender, EventArgs e) { 
     string accountid = (ACCOUNTID); 
     string key = (KEY); 
     string baseURL = "https://www.eiseverywhere.com"; 

     baseURL = baseURL.Remove(baseURL.LastIndexOf("/"),1).TrimEnd() + "/api/v2/";//rtrim(baseURL,"/")+"/api/v2/"; 

     Debug.WriteLine("baseURL: " + baseURL); 

     string request = RawRequest(baseURL+"global/authorize.json", 
             new string[]{accountid,key}); 
     //string response = json_decode(request["response"], true); 
     var data = new Dictionary<string, string>(); //REF:http://stackoverflow.com/questions/7699972/how-to-decode-a-json-string-using-c 
     //data.Add("foo", "baa"); 
     JavaScriptSerializer ser = new JavaScriptSerializer(); 
     var JSONString = ser.Serialize(data); 
     var JSONObj = ser.Deserialize<Dictionary<string, string>>(JSONString); 

     string response = JSONObj["response"]; 

     //if (empty(response["accesstoken"])) { 
     // throw new Exception(__CLASS__+": Bad url or parameters given. "+print_r(response,1)); 
     //} 
     accessToken = JSONObj["accesstoken"]; //response["accesstoken"]; 
     response = RawRequest(baseURL+"global/listAvailableFunctions.json", new string[]{accessToken}); 
     functions = JSONObj;//json_decode(response["response"], true); 
     foreach (var section in functions) { 
      foreach (var functionArray in section) { 
       foreach (var functionName in functionArray) { 
        this.functions[functionName] = new List<string>{methodName, sectionName}; 
       } 
      } 
     } 


     //_Default api = new _Default(); 

     string call = "listFolders"; 

     response = Request(call); 
     string folders = json_decode(response["response"], true); 
     //Dump(call, folders); 

     string[] parameters = new string[]{"New event created by etouches API","eHome","eMobile","eSelect","eReg","eBooth","eConnect","eSocial","eSeating"}; 
     if (count(folders)) { 
      parameters["folder"] = folders[0]["folderid"]; 
     } 

     xml.LoadXml(SomeXMLString); 
     string itemID = xml.GetElementsByTagName("itemID")(0).InnerText; 

     call="createEvent"; 
     this.SetFormat("xml"); 
     response = Request(call, parameters); 
     string newEvent = new SimpleXMLElement(response["response"]); 
     //Dump(call, newEvent); 

     this.SetFormat("json"); 
     response = Request(call = "listEvents"); 
     string events = json_decode(response["response"], true); 
     //Dump(call, events); 

     this.SetFormat("xml"); 
     response = Request(call = "listSpeakers", new string[]{events[0]["eventid"]}); 
     string speakers = new SimpleXMLElement(response["response"]); 
     //Dump(call, speakers); 

     response = Request(call = "getEvent", new string[]{events[0]["eventid"]}); 
     string eventt = new SimpleXMLElement(response["response"]); 
     //Dump(call, eventt); 

     response = Request(call = "cloneEvent", new string[]{events[0]["eventid"],"Event cloned via etouches API"}); 
     string clonedEvent = new SimpleXMLElement(response["response"]); 
     //Dump(call, clonedEvent); 

    } 

    public void SetFormat(string format) 
    { 
     string[] validFormats = new string[]{"xml","json"}; 
     if (!validFormats.Contains(format)) { 
      string message = __CLASS__+": Invalid format: " + format + " Not one of the following:"; 
      foreach (var value in validFormats) { 
       message = " "+value; 
      } 
      throw new Exception(message); 
     } 
     this.format = format; 
    } 

    public static string Request(string request, string[] parameters) 
    { 
     parameters["accesstoken"] = accessToken; 
     if (! array_key_exists(request, functions)) { 
      return new string[]{ 
       "", 
       functions, 
       "Unknown function: request", 
     }; 
     } 
     string[] function = functions[request]; 
     string url = baseURL.function["section"]+"/"+request+"+"+this.format; 
     return RawRequest(url, parameters, function["method"]); 
    } 

    public static string RawRequest(string url, string[] parameters) 
    { 
     string[] result; 
     string method = "get"; 
     string response = "Unable to use etouches API, please enable cURL functionality (http://php.net/curl) for your server and try again"; 
     string info = ""; 
     string errors = ""; 
     method = method.ToLower(); 

     //string ch = curl_init(); 
     HttpWebRequest ch = (HttpWebRequest)WebRequest.Create(this.Request.Url.Scheme); 
     curl_setopt(ch, CURLOPT_CUSTOMREQUEST, method); 
     string paramString = http_build_query(parameters); 
     curl_setopt(ch, CURLOPT_URL, url . (!empty(paramString)?"?"+paramString:"")); 
     if (method == "post") { 
      foreach (var value in parameters) { 
       if (is_array(value)) { 
        value = http_build_query(value); 
       } 
      } 
      curl_setopt(ch, CURLOPT_POSTFIELDS, parameters); 
     } else if (method == "put") { 
      curl_setopt(ch, CURLOPT_RETURNTRANSFER, true); 
      curl_setopt(ch, CURLOPT_HTTPHEADER, new string[]{"Content-Length: " , paramString.Length}); 
      curl_setopt(ch, CURLOPT_POSTFIELDS, paramString); 
     } 
     curl_setopt(ch, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt(ch, CURLOPT_CONNECTTIMEOUT, 10); 
     curl_setopt(ch, CURLOPT_TIMEOUT, 30); 
     curl_setopt(ch, CURLOPT_SSL_VERIFYPEER, false); 

     response = curl_exec(ch); 
     info = curl_getinfo(ch); 
     errors = curl_error(ch); 

     curl_close(ch); 


     result = new string[]{response,info,errors}; 

     return result; 
    } 

    //private void Dump(string h1, string var) 
    //{ 
    // Response.Write("<h1>" + h1 + "</h1>"); 
    // var_dump(var); 
    //} 
}//class 
+3

По крайней мере, опубликуйте, что вы сделали до сих пор. – Cyral

+2

Код PHP выглядит несколько устаревшим. Dunno, если это вам поможет, но, скорее всего, его можно было не только сжать в PHP, но и в .NET. Возможно, вам проще понять только то, что он делает, а затем написать функциональность с нуля в .NET. – hakre

+0

Спасибо, hakre, честно говоря, я определенно склоняюсь таким образом. – sabastienfyrre

ответ

1

Я создал новый вопрос и ответ под названием «How to Convert PHP to .NET For Beginners». Это результат всех моих исследований в этой теме и объясняет, что сработало для меня. Я надеюсь, что это поможет вам найти быстрое и простое решение.

+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - [Из обзора] (/ review/low-quality-posts/18857045) – pirho

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