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