দেরিতে প্রতিক্রিয়া তবে এটিই আমি শেষ করছি। আপনি যদি লিনাক্সটিতে চালিত করেন এবং আপনার উইন্ডোজ 10 বা পরে রয়েছে তবে আপনার কার্ল কমান্ডগুলি খুব একইভাবে চালাতে চান:
public static string ExecuteCurl(string curlCommand, int timeoutInSeconds=60)
{
if (string.IsNullOrEmpty(curlCommand))
return "";
curlCommand = curlCommand.Trim();
if (curlCommand.StartsWith("curl"))
{
curlCommand = curlCommand.Substring("curl".Length).Trim();
}
{
curlCommand = curlCommand.Replace("--compressed", "");
var fullPath = System.IO.Path.Combine(Environment.SystemDirectory, "curl.exe");
if (System.IO.File.Exists(fullPath) == false)
{
if (Debugger.IsAttached) { Debugger.Break(); }
throw new Exception("Windows 10 or higher is required to run this application");
}
List<string> parameters = new List<string>();
try
{
Queue<char> q = new Queue<char>();
foreach (var c in curlCommand.ToCharArray())
{
q.Enqueue(c);
}
StringBuilder currentParameter = new StringBuilder();
void insertParameter()
{
var temp = currentParameter.ToString().Trim();
if (string.IsNullOrEmpty(temp) == false)
{
parameters.Add(temp);
}
currentParameter.Clear();
}
while (true)
{
if (q.Count == 0)
{
insertParameter();
break;
}
char x = q.Dequeue();
if (x == '\'')
{
insertParameter();
while (true)
{
x = q.Dequeue();
if (x == '\\' && q.Count > 0 && q.Peek() == '\'')
{
currentParameter.Append('\'');
q.Dequeue();
continue;
}
if (x == '\'')
{
insertParameter();
break;
}
currentParameter.Append(x);
}
}
else if (x == '"')
{
insertParameter();
while (true)
{
x = q.Dequeue();
if (x == '\\' && q.Count > 0 && q.Peek() == '"')
{
currentParameter.Append('"');
q.Dequeue();
continue;
}
if (x == '"')
{
insertParameter();
break;
}
currentParameter.Append(x);
}
}
else
{
currentParameter.Append(x);
}
}
}
catch
{
if (Debugger.IsAttached) { Debugger.Break(); }
throw new Exception("Invalid curl command");
}
StringBuilder finalCommand = new StringBuilder();
foreach (var p in parameters)
{
if (p.StartsWith("-"))
{
finalCommand.Append(p);
finalCommand.Append(" ");
continue;
}
var temp = p;
if (temp.Contains("\""))
{
temp = temp.Replace("\"", "\\\"");
}
if (temp.Contains("'"))
{
temp = temp.Replace("'", "\\'");
}
finalCommand.Append($"\"{temp}\"");
finalCommand.Append(" ");
}
using (var proc = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "curl.exe",
Arguments = finalCommand.ToString(),
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true,
WorkingDirectory = Environment.SystemDirectory
}
})
{
proc.Start();
proc.WaitForExit(timeoutInSeconds*1000);
return proc.StandardOutput.ReadToEnd();
}
}
}
কোডটি কিছুটা দীর্ঘ হওয়ার কারণ হ'ল আপনি যদি একটি একক উদ্ধৃতি কার্যকর করেন তবে উইন্ডোজ আপনাকে ত্রুটি দেয়। অন্য কথায়, কমান্ডটি curl 'https://google.com'
লিনাক্সে কাজ করবে এবং এটি উইন্ডোতে কাজ করবে না। আমি যে পদ্ধতিটি তৈরি করেছি তার জন্য ধন্যবাদ আপনি একক উদ্ধৃতি ব্যবহার করতে পারেন এবং আপনার কার্ল কমান্ডগুলি ঠিক যেমন আপনি লিনাক্সে চালাতে পারেন তা চালাতে পারেন। এই কোডটি যেমন \'
এবং এর মতো অক্ষরগুলি পালানোর জন্যও পরীক্ষা করে \"
।
উদাহরণস্বরূপ এই কোডটি ব্যবহার করুন
var output = ExecuteCurl(@"curl 'https://google.com' -H 'Accept: application/json, text/javascript, */*; q=0.01'");
আপনি যদি একই স্ট্রিংটি আবার চালনা করেন তবে C:\Windows\System32\curl.exe
এটি কাজ করবে না কারণ কোনও কারণে উইন্ডোজ একক উদ্ধৃতি পছন্দ করে না।