简体   繁体   English

将某些 PHP 转换为 C# 时遇到问题

[英]Trouble converting some PHP to C#

I'm a .NET developer, and (confession time) I've never used PHP for anything ever.我是 .NET 开发人员,并且(忏悔时间)我从来没有使用过 PHP。 I find myself needing to convert some PHP to test an API.我发现自己需要转换一些 PHP 来测试 API。 I've converted much of it, bringing my error count from over 400 to 69, however, the further I go, the more convinced I am that it's just going to be broken.我已经转换了其中的大部分,使我的错误计数从 400 多个增加到 69,但是,我走得越远,我就越确信它会被破坏。

So, I've decided to throw myself at the mercy of my fellow devs and ask for some help.所以,我决定任由我的开发人员摆布并寻求一些帮助。

What I'm converting is this, a wrapper class that calls the API and returns XML or JSON.我要转换的是这个,一个调用 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);

Where I'm having the most trouble, is the PHP method calls.我最麻烦的地方是 PHP 方法调用。 I've been looking up c# equivalents to the best of my ability, but the final result just isn't pretty.我一直在尽我所能地寻找 c# 等价物,但最终结果并不漂亮。

So, could you please refer me to some 'PHP to C#' tools or conversion references, or help me out with the CURLs, __CLASS__ , and other PHP specifics?那么,您能否请我参考一些“PHP 到 C#”工具或转换参考,或者帮助我了解 CURL、 __CLASS__和其他 PHP 细节?

I should note, I've looked into Phalanger, and would prefer not to use it if possible.我应该注意,我已经研究过 Phalanger,如果可能的话,我宁愿不使用它。 I also haven't found any comprehensive PHP to C# conversion tools or guides as of yet.我还没有找到任何全面的 PHP 到 C# 转换工具或指南。

Thank you in advance!先感谢您!

EDIT:编辑:

As requested, here's my attempt at conversion (I know, it's messy, I'm not proud of it. Not fully converted, in flux.)根据要求,这是我的转换尝试(我知道,这很混乱,我并不为此感到自豪。没有完全转换,在不断变化。)

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

I've created a new Question and Answer called " How to Convert PHP to .NET For Beginners ".我创建了一个名为“ 如何将 PHP 转换为 .NET 初学者”的新问答。 It's the result of all my research into the topic and explains what worked for me.这是我对该主题的所有研究的结果,并解释了对我有用的内容。 I hope that it will help you find a fast and simple resolution.我希望它能帮助您找到一个快速而简单的解决方案。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM