我想在我的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调用?
答案 0 :(得分:131)
好吧,你不会直接打电话给cURL,而是使用以下选项之一:
HttpWebRequest
/ HttpWebResponse
WebClient
HttpClient
(可从.NET 4.5开始)我强烈建议使用HttpClient
类,因为它的设计要比前两个更好(从可用性的角度来看)。
在你的情况下,你会这样做:
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
类对处理不同的响应类型有更好的支持,并且比前面提到的选项更好地支持异步操作(以及取消它们)。
答案 1 :(得分:14)
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);
答案 2 :(得分:10)
下面是一个工作示例代码。
请注意,您需要添加对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();
答案 3 :(得分:1)
我知道这是一个非常老的问题,但是我发布了此解决方案以防万一。我最近遇到了这个问题,谷歌带领我来到这里。此处的答案有助于我理解问题,但是由于我的参数组合,仍然存在问题。最终解决我问题的是curl to C# converter。它是一个非常强大的工具,并支持Curl的大多数参数。它生成的代码几乎可以立即运行。
答案 4 :(得分:1)
不要忘记添加 System.Net.Http,特别是如果您收到此错误:
<块引用>严重性代码描述项目文件行抑制状态 错误 CS0246 类型或命名空间名称 'HttpClient' 不能 找到(您是否缺少 using 指令或程序集 参考?)1_default.aspx D:\Projetos\Testes\FacebookAPI\FB-CustomAudience\default.aspx.cs 56 Active
在这种情况下,您应该:
答案 5 :(得分:0)
从控制台应用程序调用cURL不是一个好主意。
但是您可以使用TinyRestClient来简化请求的构建:
var client = new TinyRestClient(new HttpClient(),"https://api.repustate.com/");
client.PostRequest("v2/demokey/score.json").
AddQueryParameter("text", "").
ExecuteAsync<MyResponse>();
答案 6 :(得分:0)
最新回应,但这就是我最终要做的。如果要在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下将不运行。由于我创建了该方法,因此您可以使用单引号并完全像在Linux上运行curl命令一样运行curl命令。此代码还检查转义字符,例如\'
和\"
。
例如,将此代码用作
var output = ExecuteCurl(@"curl 'https://google.com' -H 'Accept: application/json, text/javascript, */*; q=0.01'");
如果您在哪里再次运行相同的字符串C:\Windows\System32\curl.exe
,则将无法正常工作,因为某些原因,Windows不喜欢单引号。
答案 7 :(得分:0)
好吧,如果您是不熟悉cmd-line exp的C#用户。您可以使用“ https://curl.olsh.me/”之类的在线网站,也可以搜索curl到C#转换器将返回可以为您完成此操作的网站。
或者,如果您使用的是邮递员,则可以使用“生成代码段”,而邮递员代码生成器的唯一问题是对RestSharp库的依赖。