Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将某些PHP转换为C时出现问题#_C#_Php_Json_Xml_Curl - Fatal编程技术网

C# 将某些PHP转换为C时出现问题#

C# 将某些PHP转换为C时出现问题#,c#,php,json,xml,curl,C#,Php,Json,Xml,Curl,我是一名.NET开发人员,(坦白地说)我从来没有用过PHP。我发现自己需要转换一些PHP来测试API。我已经转换了它的大部分,使我的错误计数从400多个增加到69个,然而,我走得越远,我就越相信它会被打破 所以,我决定让我的开发伙伴们来摆布我自己,并寻求一些帮助 我要转换的是这个,一个调用API并返回XML或JSON的包装类 <?php class APIv2 { protected $accessToken; protected $baseURL; protected $functio

我是一名.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代码看起来有点过时。不知道这是否对您有帮助,但很可能它不仅可以在PHP中压缩,还可以在.NET中压缩。也许更容易理解它的功能,然后在.NET中从头开始编写功能。代码转储没有乐趣。如果您有关于.NET/C相当于某些PHP功能的具体问题,您可能会很快得到这些问题的答案,即使您有很多问题。不过,打开我的编辑器,乏味地转换一个长代码转储并不是我想做的事情(尽管我只能为自己说话)。请将我添加到那些认为您应该首先详细了解PHP程序正在做什么,然后编写一个执行相同行为的.NET程序的人中。这样做会得到比逐句翻译更好的结果。@PHP中的sabastienfyre IMHO uuu CLASS_uu与C中的
this.GetType().Name
,在某些情况下甚至是
this.className
。对于PHP中的CURL,我建议您在C中使用HttpWebRequest#
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