C#Web API在HTTP Post REST客户端中发送身体数据

C#Web API在HTTP Post REST客户端中发送身体数据,c#,asp.net-web-api,asp.net-core,advanced-rest-client,C#,Asp.net Web Api,Asp.net Core,Advanced Rest Client,我需要发送此HTTP Post请求: POST https://webapi.com/baseurl/login Content-Type: application/json {"Password":"password", "AppVersion":"1", "AppComments":"", "UserName":"username", "AppKey":"dakey" } 它在RestClient和PostMan中非常有效,就像上面所述 我需要有这个专业语法,不知道是

我需要发送此HTTP Post请求:

 POST https://webapi.com/baseurl/login
 Content-Type: application/json

 {"Password":"password",
 "AppVersion":"1",
 "AppComments":"",
 "UserName":"username",
 "AppKey":"dakey" 
  }
它在RestClient和PostMan中非常有效,就像上面所述

我需要有这个专业语法,不知道是否使用

WebClient、HTTPRequest或WebRequest来完成此任务

问题是如何格式化正文内容并将其与请求一起发送到上面

下面是我的WebClient示例代码

  private static void Main(string[] args)
    {
        RunPostAsync();
    } 

    static HttpClient client = new HttpClient();

    private static void RunPostAsync(){

            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/json"));

            Inputs inputs = new Inputs();

            inputs.Password = "pw";
            inputs.AppVersion = "apv";
            inputs.AppComments = "apc";
            inputs.UserName = "user";
            inputs.AppKey = "apk";


            var res = client.PostAsync("https://baseuriplus", new StringContent(JsonConvert.SerializeObject(inputs)));

            try
            {
                res.Result.EnsureSuccessStatusCode();

                Console.WriteLine("Response " + res.Result.Content.ReadAsStringAsync().Result + Environment.NewLine);

            }
            catch (Exception ex)
            {
                Console.WriteLine("Error " + res + " Error " + 
                ex.ToString());
            }

        Console.WriteLine("Response: {0}", result);
    }       

    public class Inputs
    {
        public string Password;
        public string AppVersion;
        public string AppComments;
        public string UserName;
        public string AppKey;
    }

现在,这在(200)OK服务器和响应上可以正常工作和响应了。为什么要生成自己的json

使用JsonNewtonsoft中的
JSONConvert

您的json对象字符串值需要
引号和

我会使用http客户端进行发布,而不是webclient

using (var client = new HttpClient())
{
   var res = client.PostAsync("YOUR URL", 
     new StringContent(JsonConvert.SerializeObject(
       new { OBJECT DEF HERE },
       Encoding.UTF8, "application/json")
   );

   try
   {
      res.Result.EnsureSuccessStatusCode();
   } 
   catch (Exception e)
   {
     Console.WriteLine(e.ToString());
   }
}   

在发送之前,您没有正确地将值序列化为JSON。您应该使用类似JSON.Net的库,而不是自己构建字符串

您可以通过以下方式获得正确的字符串:

var message = JsonConvert.SerializeObject(new {Password = pw, AppVersion = apv, AppComments = acm, UserName = user, AppKey = apk});
Console.WriteLine(message); //Output: {"Password":"password","AppVersion":"10","AppComments":"","UserName":"username","AppKey":"dakey"}

我们将使用HttpPost和HttpClient PostAsync来解决此问题

using System.Net.Http;
    static async Task<string> PostURI(Uri u, HttpContent c)
    {
    var response = string.Empty;
    using (var client = new HttpClient())
    {
    HttpResponseMessage result = await client.PostAsync(u, c);
    if (result.IsSuccessStatusCode)
    {
    response = result.StatusCode.ToString();
    }
    }
    return response;
    }
var-client=newrestclient(“您的URL”);
var请求=新的重新请求(Method.POST);
AddHeader(“内容类型”、“应用程序/json”);
请求.AddHeader(“apk密钥”,apk);
//序列化到JSON主体。
JObject jObjectbody=新JObject();
添加(“employeeName”,data.name);
jObjectbody.Add(“名称”,数据名称);
AddParameter(“application/json”,jObjectbody,ParameterType.RequestBody);
尝试
{
var clientValue=client.Execute(请求);
返回RequestResponse.Create(ResponseCode.OK,“,clientValue.Data);
}
捕获(异常)
{
抛出异常;
}

我制作了一个工具来快速轻松地完成这项工作:

Install-Package AdvancedRestHandler

AdvancedRestHandler arh=新的AdvancedRestHandler(“https://webapi.com/baseurl");
var result=await arh.PostDataAsync(“/login”),新的MyLoginRequest{
Password=“Password”,
AppVersion=“1”,
AppComments=“”,
UserName=“UserName”,
AppKey=“dakey”
});
公共类MyLoginRequest{
公共字符串密码{get;set;}
公共字符串AppVersion{get;set;}
公共字符串AppComments{get;set;}
公共字符串用户名{get;set;}
公共字符串AppKey{get;set;}
}
公共类MyLoginResponse{
公共字符串标记{get;set;}
}

额外: 您还可以使用
ArhResponse

  • 无论采用哪种方式,在类定义中:
公共类MyLoginResponse:arhrResponse
{
...
}
  • 或者通过这种方式,在API调用中:
var result=await arh.PostDataAsync


至于(AdvancedRestHandler)ARH,由于与某个公司集成,我修复了它,但我不完全记得。。。我这样做了,或者是通过
选项
之类的请求,或者是通过重置
标题
值。

属性键和它们的值都没有要求的双引号作为JSON。上面发布了此代码的工作版本供我使用。不需要StringContent参数。谢谢@Yat这段代码有很多错误。为什么选择Task.Run()?为什么处置您的HttpClient?为什么在失败时返回空字符串,或者将状态代码作为字符串返回?在哪些情况下,该方法提供了什么便利?这段代码是如何回答这个问题的?这一点都没有错…我尝试了上面提供的许多解决方案。空响应,如果我们有错误的api或错误的参数..在这种情况下,它将返回空响应..Task.Run()将执行api并根据任务的分配返回值。某些代码适用于某些场景,并不意味着它是好代码。请参阅示例和。请解释您的代码在做什么,以及为什么它解决了这个问题
Install-Package AdvancedRestHandler
dotnet add package AdvancedRestHandler