我正在尝试找到一种方法,如何将curl命令传输到C#。
我需要从api获取令牌并将其保存到文件C:\ ... \ x.json \
然后,我想将令牌声明为变量,然后将其用于另一个curl POST请求中,以获取与之配合使用的数据。
卷曲:
curl -X POST "https://example.com"
-H "accept: application/json"
-H "Content-Type: application/json"
-d {"username":"username","password":"password"}
我当前的尝试:
static void Main(string[] args)
{
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://example.com"))
{
request.Headers.TryAddWithoutValidation("Accept", "application/json");
request.Content = new StringContent("{\"username\":\"username\",\"password\":\"password\"}", Encoding.UTF8, "application/json");
var response = await httpClient.SendAsync(request);
}
}
}
我尝试了几种方法,但是都没有用。这是来自curl.olsh.me,但我也收到一些等待中的错误,我不知道该怎么办。 (我是C#的新手):
“ await”运算符只能在异步方法中使用。考虑使用“异步”修饰符标记此方法,并将其返回类型更改为“任务”。
curl -v输出:
答案 0 :(得分:2)
您必须设置主要方法async
:
static async void Main(string[] args)
如果您使用的C#版本<7.1,则不能直接在Main
中使用任何等待。在这种情况下,您必须为其定义一个Task
和.Wait()
(而不是为其定义await
)。
Task task = ....;
task.Wait();
var result = task.Result;
答案 1 :(得分:1)
C#7中提供了异步主要方法。如果您使用的是较早版本,则可以像这样“手动”处理任务
var task = httpClient.SendAsync(request);
task.Wait();
var response = task.Result;
Console.WriteLine(response.Content.ReadAsStringAsync().Result);
答案 2 :(得分:1)
据我所知,您需要将用户名和密码转换为字节,并将其作为基数64字符串并将其传递给标头。当您使用await时,如果它是一个空方法,则应在其签名中添加带有Task的async修饰符,或者以防该方法返回比使用async Task更为复杂的类型,如示例所示。在这种情况下,您需要使用测试示例中所示的结果来获取结果。您可以在Microsoft文档中阅读有关此主题的更多信息。
代码如下:
public async Task<HttpResponseMessage> CreateAuthorization(string url, string username, string password)
{
HttpResponseMessage response;
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("POST"), url))
{
request.Headers.TryAddWithoutValidation("Accept", "application/json");
var authorization = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{username}:{password}"));
request.Headers.TryAddWithoutValidation("Authorization", $"Basic {authorization}");
response = await httpClient.SendAsync(request);
}
}
return response;
}
以下是测试示例:
public void CreateAuthorizationTest()
{
var response = CreateAuthorization("https://example.com", "username", "password");
var result = response.Result;
var o = result.Content.ReadAsStringAsync();
if (result.IsSuccessStatusCode)
{
//do some thing if success
// you can do deserialization what ever
Console.WriteLine(o);
}
else
{
//do some thing if error
Console.WriteLine(o);
}
//etc.
}
链接:
答案 3 :(得分:0)
我使用System.Net.Http.Formatting.Extension
示例:
using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
// Add NuGet package System.Net.Http.Formatting.Extension
namespace SimpleRestCall
{
class Program
{
static CancellationTokenSource cts = new CancellationTokenSource();
static readonly string sitePath = "https://example.com";
static void Main(string[] args)
{
using (var client = new HttpClient { BaseAddress = new Uri(sitePath), Timeout = new TimeSpan(0, 1, 0) })
{
Task.Run(() => Login(client)).Wait();
}
}
private static async Task Login(HttpClient client)
{
string path = ""; // if it's a controller path put it here
LoginData postData = new LoginData { username = "username", password = "password" };
string json;
using (HttpResponseMessage resp = await client.PostAsJsonAsync(path, postData, cts.Token))
{
json = await resp.Content.ReadAsStringAsync();
}
Console.WriteLine(json);
Console.WriteLine("Press a key to finish");
string aa = Console.ReadLine();
}
private class LoginData
{
public string username { get; set; }
public string password { get; set; }
}
}
}
答案 4 :(得分:0)
更新:
我从服务器收到此响应:
状态码:200,原因短语:“确定”,版本:1.1,内容:System.Net.Http.StreamContent,标头: { 日期:2018年9月25日星期二06:57:16 GMT 日期:2018年9月25日星期二06:57:17 GMT 连接方式:关闭 Set-Cookie:TS0119a36f = 015d56898097bc7f5dccb374f352898f8806da5833c9f8a8ef4ff6ae2a2b1d4e78147fb79479f8bf85929406f34372c41c63572a89;路径= /;域= .example.com 传输编码:分块 内容类型:application / json }
我认为编码或idk存在一些问题。当我执行curl时,我得到此输出(我需要的输出):
{“代码”:200,“状态”:“成功”,“ sessionId”:“ 350bf800-bfdb-11e8-991a-d35510009464”}
当前代码:
static void Main(string[] args)
{
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api.example.com"))
{
request.Headers.TryAddWithoutValidation("accept", "application/json");
request.Content = new StringContent("{\"username\":\"user\",\"password\":\"pass\"}", Encoding.UTF8, "application/json");
var task = httpClient.SendAsync(request);
task.Wait();
var response = task.Result;
Console.WriteLine(response);
Console.ReadKey();
}
}
}
答案 5 :(得分:0)
使用此网站 https://curl.olsh.me/
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://example.com/"))
{
request.Headers.TryAddWithoutValidation("Accept", "application/json");
request.Content = new StringContent("{\"username\":\"username\",\"password\":\"password\"}", Encoding.UTF8, "application/json");
var response = await httpClient.SendAsync(request);
}
}