将POST卷曲成C#

Luk*_*asV 6 c# curl

我试图找到一种方法,如何将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"}
Run Code Online (Sandbox Code Playgroud)

我目前的尝试:

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);
        }
    }                        
}
Run Code Online (Sandbox Code Playgroud)

我尝试了几种方法,但是都没有用。这是来自curl.olsh.me,但我也收到一些等待中的错误,我不知道该怎么办。(我是C#的新手):

“ await”运算符只能在异步方法中使用。考虑使用“异步”修饰符标记该方法,并将其返回类型更改为“任务”。

curl -v输出:

    • 正在尝试10.0.0.0 ...
    • TCP_NODELAY设置
    • 已连接至example.com(10.0.0.0)端口443(#0)
    • ALPN,提供h2
    • ALPN,提供http / 1.1
    • 成功设置证书验证位置:
    • CAfile:C:\ Users \ lvrabel \ Downloads \ curl-7.60.0-win64-mingw \ curl-7.60.0-win64-mingw \ bin \ curl-ca-bundle.crt CApath:无
    • TLSv1.2(OUT),TLS握手,客户端问候(1):
    • TLSv1.2(IN),TLS握手,服务器问候(2):
    • TLSv1.2(IN),TLS握手,证书(11):
    • TLSv1.2(IN),TLS握手,服务器密钥交换(12):
    • TLSv1.2(IN),TLS握手,服务器完成(14):
    • TLSv1.2(OUT),TLS握手,客户端密钥交换(16):
    • TLSv1.2(OUT),TLS更改密码,客户端问候(1):
    • TLSv1.2(OUT),TLS握手,已完成(20):
    • TLSv1.2(IN),TLS握手,已完成(20):
    • 使用TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256的SSL连接
    • ALPN,服务器不同意协议
    • 服务器证书:
    • subject:OU =已验证域控制;OU = PositiveSSL通配符;CN = *。example.com
    • 开始日期:2016年12月1日00:00:00 GMT
    • 到期日期:2019年12月1日23:59:59 GMT
    • subjectAltName:主机“ example.com”与证书的“ * .example.com”匹配
    • 发行者:C = GB;ST =大曼彻斯特;L =索尔福德;O = COMODO CA Limited;CN = COMODO RSA域验证安全服务器
    • SSL证书验证成功。<POST / cxf / IOTServices / v2 /登录HTTP / 1.1 <主机:example.com <用户代理:curl / 7.60.0 <接受:application / json <内容类型:application / json <内容长度:64 <
    • 上传完全发送:64个字节中的64个<HTTP / 1.1 200 OK <日期:2018年9月24日星期一09:22:30 GMT <内容类型:application / json <日期:2018年9月24日星期一09:22: 31 GMT <连接:关闭<Set-Cookie:TS0119a36f = 015d568915873c94e852616fd92d5dd7a03a620f3cd2326781154684dfd7b31302f6fcb9822598d5a76466d0c6a25583fccbb30c7d; 路径= /; Domain = .example.com <传输编码:分块<{“代码”:200,“状态”:“成功”,“ sessionId”:“ 5cd92d80-bfdb-11e8-83c7-5b742f0c1244”} *关闭连接0
    • TLSv1.2(OUT),TLS警报,客户端问候(1):

Jin*_*kur 5

使用这个网站 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);
    }
}
Run Code Online (Sandbox Code Playgroud)


may*_*ʎɐɯ 5

据我所知,您需要将用户名和密码转换为字节,并将其作为 Base 64 字符串并将其传递给 header。当您使用await时,如果它是一个void方法,那么您应该在其签名中添加带有Task的async修饰符,或者如果该方法应该返回任何类型而不是使用async Task,如示例中所示。在这种情况下,您需要使用测试示例中所示的结果来获取结果。您可以在Microsoft文档中阅读有关此主题的更多信息。

\n\n

这是代码:

\n\n
public async Task<HttpResponseMessage> CreateAuthorization(string url, string username, string password)\n{\n    HttpResponseMessage response;\n\n    using (var httpClient = new HttpClient())\n    {\n        using (var request = new HttpRequestMessage(new HttpMethod("POST"), url))\n        {\n            request.Headers.TryAddWithoutValidation("Accept", "application/json");\n            var authorization = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{username}:{password}"));\n            request.Headers.TryAddWithoutValidation("Authorization", $"Basic {authorization}");\n            response = await httpClient.SendAsync(request);\n        }\n    }\n\n    return response;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是测试它的示例:

\n\n
public void CreateAuthorizationTest()\n{\n    var response = CreateAuthorization("https://example.com", "username", "password");\n    var result = response.Result;\n    var o = result.Content.ReadAsStringAsync();\n\n    if (result.IsSuccessStatusCode)\n    {\n        //do some thing if success\n        // you can do deserialization what ever\n        Console.WriteLine(o);\n    }\n    else\n    {\n        //do some thing if error\n        Console.WriteLine(o);\n    }\n    //etc.\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

链接:

\n\n\n


Han*_*ian 2

C# 7 中提供了异步主方法。如果您使用的是早期版本,您可以像这样“手动”处理任务

var task = httpClient.SendAsync(request);
task.Wait();
var response = task.Result;
Console.WriteLine(response.Content.ReadAsStringAsync().Result);
Run Code Online (Sandbox Code Playgroud)