如何在URL中POST查询字符串参数


下面的C#代码(他们说这个代码有效(生成HTTP请求,该请求在Body中传递参数。我正在使用的Web服务器看不到这些参数,但当POST请求在URL中包含参数时,它就可以工作了,如下所示:

http://my.zadarma.com/auth/?p=%2Fconnect%2Fsms%2F

下面的C#代码创建以下请求将参数放入正文

C#:
POST http://my.zadarma.com/auth/ HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: my.zadarma.com
Content-Length: 21
Expect: 100-continue
Connection: Keep-Alive
p=%2Fconnect%2Fsms%2F

邮差创建以下请求-将参数放入URL(我的服务器更喜欢这样(:

POST http://my.zadarma.com/auth/?p=%2Fconnect%2Fsms%2F HTTP/1.1
User-Agent: PostmanRuntime/7.29.2
Accept: */*
Postman-Token: d6b3df55-d42f-45e8-82b8-a3fd11b02e35
Host: my.zadarma.com
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 0

如何更改以下代码(使用FormUrlEncodedContent或类似代码(以将查询字符串参数连接到POST请求中的URL?(就像邮差一样(:

public static async Task<HttpStatusCode> UpdateProductAsync()
{
var url = "http://my.zadarma.com/auth/";
var client = new System.Net.Http.HttpClient();
var data = new Dictionary<string, string>
{
{"p", "/connect/sms/"}
};
var res = await client.PostAsync(url, new FormUrlEncodedContent(data));
var content = await res.Content.ReadAsStringAsync();
Console.WriteLine(content);
var responseString = await res.Content.ReadAsStringAsync();
return res.StatusCode;
}

我可以将URL和params连接起来——这会起作用,但我尽量避免连接。更新:以下作品。但是,有没有更一致的方法来处理参数?

public static async Task<HttpStatusCode> UpdateProductAsync(NetworkParameters networkParameters)
{
var url = "http://127.0.0.1:5001/api/v0/files/stat";
var client = new System.Net.Http.HttpClient();
string queryStringKey = HttpUtility.UrlEncode("arg", Encoding.UTF8);
string queryStringValue = HttpUtility.UrlEncode("/KeySet", Encoding.UTF8);
var res = await client.PostAsync(url + "?" + queryStringKey + "=" + queryStringValue, null);
var content = await res.Content.ReadAsStringAsync();
var responseString = await res.Content.ReadAsStringAsync();
return res.StatusCode;
}

您可以使用Microsoft.AspNetCore.WebUtilities.dll中的queryhelper类
https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.webutilities.queryhelpers.addquerystring?view=aspnetcore-7.0

var newUrl = QueryHelpers.AddQueryString(url, data);

@Vlad您不能将.Net Framework与Net Core一起使用,但您可以创建一个.Net Standard 2.0项目,并将其用于.Net Framework和.Net Core