C#Web API在HTTP Post REST客户端中发送身体数据
我需要发送此HTTP Post请求: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中非常有效,就像上面所述 我需要有这个专业语法,不知道是
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