无法将某些PHP转换为C#

时间:2015-07-03 19:06:34

标签: c# php json xml curl

我是.NET开发人员,并且(坦白时间)我从来没有使用过PHP。我发现自己需要转换一些PHP来测试API。我已经转换了大部分内容,将我的错误计数从400多个调到69个,然而,越往前走,我越相信它就会被打破。

所以,我决定把自己置于同伴的怜悯之下,并寻求一些帮助。

我正在转换的是一个包装类,它调用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#转换工具或指南。

提前谢谢!

修改

根据要求,这是我转换的尝试(我知道,这很麻烦,我并不为此感到骄傲。没有完全转换,不断变换。)

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

1 个答案:

答案 0 :(得分:1)

我创建了一个名为&#34; How to Convert PHP to .NET For Beginners&#34;的新问答。这是我对该主题进行的所有研究的结果,并解释了对我有用的内容。我希望它能帮助您找到快速简单的解决方案。