当前位置: 七九推 > IT编程>开发语言>c# > c#执行curl命令(c#代码执行curl字符串命令)

c#执行curl命令(c#代码执行curl字符串命令)

2022年08月22日 c# 我要评论
延迟响应,以下代码就是最终要的。如果您想像在linux上运行命令一样运行curl命令,并且您有windows 10或更高版本,请执行以下操作:

延迟响应,以下代码就是最终要的。如果您想像在linux上运行命令一样运行curl命令,并且您有windows 10或更高版本,请执行以下操作:

public static string ExecuteCurl(string curlCommand, int timeoutInSeconds=60)
    {
        if (string.IsNullOrEmpty(curlCommand))
            return "";

        curlCommand = curlCommand.Trim();

        // remove the curl keworkd
        if (curlCommand.StartsWith("curl"))
        {
            curlCommand = curlCommand.Substring("curl".Length).Trim();
        }

        // this code only works on windows 10 or higher
        {

            curlCommand = curlCommand.Replace("--compressed", "");

            // windows 10 should contain this file
            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");
            }

            // on windows ' are not supported. For example: curl 'http://ublux.com' does not work and it needs to be replaced to curl "http://ublux.com"
            List<string> parameters = new List<string>();


            // separate parameters to escape quotes
            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();

                        // add until we find last '
                        while (true)
                        {
                            x = q.Dequeue();

                            // if next 2 characetrs are \' 
                            if (x == '\\' && q.Count > 0 && q.Peek() == '\'')
                            {
                                currentParameter.Append('\'');
                                q.Dequeue();
                                continue;
                            }

                            if (x == '\'')
                            {
                                insertParameter();
                                break;
                            }

                            currentParameter.Append(x);
                        }
                    }
                    else if (x == '"')
                    {
                        insertParameter();

                        // add until we find last "
                        while (true)
                        {
                            x = q.Dequeue();

                            // if next 2 characetrs are \"
                            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();
            }
        }
    }
代码有点长的原因是,如果你执行一个单引号,windows会给你一个错误。换句话说,命令curl 'https://google.com'可以在linux上工作,而不能在windows上工作。多亏了我创建的方法,您可以使用单引号并运行curl命令,就像在linux上运行它们一样。此代码还会检查转义字符,如\'和\"。
例如,将此代码用作
var output = ExecuteCurl(@"curl 'https://google.com' -H 'Accept: application/json, text/javascript, */*; q=0.01'");

如果你在哪里对C:\Windows\System32\curl.exe运行相同的字符串,它将不起作用,因为出于某种原因,windows不喜欢单引号。


我在接腾讯云的短信平台时,demo代码里面都是生成的curl命令串,在腾讯开发者社区找到以上代码,直接拿来可以调用成功发送。

以上总结希望能帮助到你的开发!

(0)
打赏 微信扫一扫 微信扫一扫

相关文章:

  • c#常用表格控件dataGridView的分页显示

    c#常用表格控件dataGridView的分页显示

    前言datagridview是常用的表格控件,实现分页的方式也有很多种,例如直接使用sql语言,配合存储方式,直接读取某一页的内容,大家如果有兴趣的话,下次整理... [阅读全文]
  • C#通过抽象工厂模式造车

    C#通过抽象工厂模式造车

    可以用抽象工厂模式来造车。车的品牌有很多,而且车的属性也不少,比如车的类型、排量、门的数量,等等。可以提炼出有关车的一个抽象类: public abstr... [阅读全文]
  • C#实现UI控件输出日志的方法详解

    C#实现UI控件输出日志的方法详解

    文章描述一般情况下,我们的日志文件是用来记录一些关键操作或者异常,并且是后台存储,并不对外开放的;但是也有些时候,特别是做一些小工具程序,需要将一些操作步骤、记... [阅读全文]
  • 如何利用C#通过sql语句操作Sqlserver数据库教程

    必要准备你得有一个sqlserver数据库,并且要和vs项目连接。关于vs连接sqlserver数据库的教程前几天发过了,链接如下vs2022连接sqlserver数据库教程调用用…

    2022年12月12日 开发语言
  • C# WinForm自动更新程序之文件上传操作详解

    C# WinForm自动更新程序之文件上传操作详解

    前言更新都写完了,但是要更新文件要怎么操作呢?连接服务器然后上传上去,修改下xml的版本号当然也是可以的,但是还是没有写个程序使用起来方便,所以这一篇就写一个简... [阅读全文]
  • C#实现协变和逆变案例

    C#实现协变和逆变案例

    关于协变逆变,solidmango的解释是比较可取的。有了协变,比如,在需要返回ienumerable<object>类型的时候,可以使用ienme... [阅读全文]

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2023  七九推 保留所有权利. 粤ICP备17035492号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com