dtwk6019 2015-07-03 19:06
浏览 65

无法将一些PHP转换为C#

I'm a .NET developer, and (confession time) I've never used PHP for anything ever. I find myself needing to convert some PHP to test an 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.

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.

<?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. I've been looking up c# equivalents to the best of my ability, but the final result just isn't pretty.

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?

I should note, I've looked into Phalanger, and would prefer not to use it if possible. I also haven't found any comprehensive PHP to C# conversion tools or guides as of yet.

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
  • 写回答

1条回答 默认 最新

  • duanlvji4780 2015-07-07 14:15
    关注

    I've created a new Question and Answer called "How to Convert PHP to .NET For Beginners". 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.

    评论

报告相同问题?

悬赏问题

  • ¥15 2024-五一综合模拟赛
  • ¥15 如何将下列的“无限压缩存储器”设计出来
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口