在C#中进行cURL呼叫

b4lqfgs4  于 2022-11-13  发布在  C#
关注(0)|答案(8)|浏览(198)

我想在C#控制台应用程序中进行以下curl调用:

curl -d "text=This is a block of text" \
    http://api.repustate.com/v2/demokey/score.json

我试着做像问题张贴here,但我不能正确地填写属性。
我还尝试将其转换为常规HTTP请求:

http://api.repustate.com/v2/demokey/score.json?text="This%20is%20a%20block%20of%20text"

我可以将cURL调用转换为HTTP请求吗?如果可以,如何转换?如果不能,如何从我的C#控制台应用程序正确地进行上述cURL调用?

sr4lhrrt

sr4lhrrt1#

当然,您不会直接调用cURL,而是使用以下选项之一:

我强烈推荐使用HttpClient类,因为它的设计(从可用性的Angular 来看)比前两个更好。
在您的情况下,可以执行以下操作:

using System.Net.Http;

var client = new HttpClient();

// Create the HttpContent for the form to be posted.
var requestContent = new FormUrlEncodedContent(new [] {
    new KeyValuePair<string, string>("text", "This is a block of text"),
});

// Get the response.
HttpResponseMessage response = await client.PostAsync(
    "http://api.repustate.com/v2/demokey/score.json",
    requestContent);

// Get the response content.
HttpContent responseContent = response.Content;

// Get the stream of the content.
using (var reader = new StreamReader(await responseContent.ReadAsStreamAsync()))
{
    // Write the output.
    Console.WriteLine(await reader.ReadToEndAsync());
}

还要注意,HttpClient类对处理不同的响应类型有更好的支持,并且比前面提到的选项更好地支持异步操作(以及取消异步操作)。

zujrkrfu

zujrkrfu2#

或者在restSharp中:

var client = new RestClient("https://example.com/?urlparam=true");
var request = new RestRequest(Method.POST);
request.AddHeader("content-type", "application/x-www-form-urlencoded");
request.AddHeader("cache-control", "no-cache");
request.AddHeader("header1", "headerval");
request.AddParameter("application/x-www-form-urlencoded", "bodykey=bodyval", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
ccgok5k5

ccgok5k53#

下面是一个工作示例代码。
请注意,您需要添加对Newtonsoft.json.linq的引用

string url = "https://yourAPIurl";
WebRequest myReq = WebRequest.Create(url);
string credentials = "xxxxxxxxxxxxxxxxxxxxxxxx:yyyyyyyyyyyyyyyyyyyyyyyyyyyyyy";
CredentialCache mycache = new CredentialCache();
myReq.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(credentials));
WebResponse wr = myReq.GetResponse();
Stream receiveStream = wr.GetResponseStream();
StreamReader reader = new StreamReader(receiveStream, Encoding.UTF8);
string content = reader.ReadToEnd();
Console.WriteLine(content);
var json = "[" + content + "]"; // change this to array
var objects = JArray.Parse(json); // parse as array  
foreach (JObject o in objects.Children<JObject>())
{
    foreach (JProperty p in o.Properties())
    {
        string name = p.Name;
        string value = p.Value.ToString();
        Console.Write(name + ": " + value);
    }
}
Console.ReadLine();

参考:TheDeveloperBlog.com

8qgya5xd

8qgya5xd4#

如果你想运行你的curl命令,就像你在linux上运行它们一样,并且你有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上不能工作。多亏了我创建的那个方法,你可以使用单引号,并像在linux上运行它们一样运行你的curl命令。此代码还检查转义字符,如\'\"
例如,使用以下代码作为
var output = ExecuteCurl(@"curl 'https://google.com' -H 'Accept: application/json, text/javascript, */*; q=0.01'");
如果你在C:\Windows\System32\curl.exe上运行相同的字符串,它将不起作用,因为出于某种原因,windows不喜欢单引号。

0ejtzxu1

0ejtzxu15#

我知道这是一个很老的问题,但我贴出这个解决方案,以防它能帮助别人。我最近遇到了这个问题,谷歌把我带到这里。这里的答案帮助我理解了这个问题,但仍然有问题,由于我的参数组合。最终解决我的问题是curl to C# converter。这是一个非常强大的工具,支持大多数的参数 curl 。它生成的代码几乎可以立即运行。

vbopmzt1

vbopmzt16#

不要忘记添加System .NET.Http,特别是在收到以下错误时:
严重性代码描述项目文件行禁止显示状态错误CS 0246未能找到类型或命名空间名称“HttpClient”(是否缺少using指令或程序集引用?)1_default. aspx D:\Projetos\Testes\FacebookAPI\FB-CustomAudience\default. aspx. cs 56活动
在这种情况下,您应该:
1.添加来自Nuget的System .NET.Http:工具/ NuGet软件包管理器/管理解决方案的NuGet软件包;
1.搜索系统.Net.Http
1.在页面顶部添加以下代码:使用System .NET.Http实现的;

dluptydi

dluptydi7#

从您的控制台应用程序调用cURL不是一个好主意。
但是您可以使用TinyRestClient,这使得构建请求更加容易:

var client = new TinyRestClient(new HttpClient(),"https://api.repustate.com/");

client.PostRequest("v2/demokey/score.json").
AddQueryParameter("text", "").
ExecuteAsync<MyResponse>();
nwo49xxi

nwo49xxi8#

如果你是新的C#与cmd-line exp。你可以使用在线网站,如“https://curl.olsh.me/“或搜索curl到C#转换器将返回网站,可以为您做这一点。
或者如果您使用的是postman,则可以使用GenerateCodeSnippet。Postman代码生成器的唯一问题是依赖于RestSharp库。

相关问题