我正在尝试将数据发送到中描述的端点 https://leonardo.pgxc.pl/doc/direct_upload.html
失败并显示“用户数据无效”。我认为这都可以表明数据丢失或无效。我确定用户和通行证是正确的。
使用像 https://reqbin.com/ 这样的服务效果很好。然后服务器接受用户数据,但由于丢失了一些文件数据而失败,这些数据目前无关紧要。这是这个过程的第二步,对我来说没有任何一步失败。
尝试从用 C# 编写的控制台应用程序执行相同操作,失败并显示“无效用户数据”
await UploadFileAsync("d:\\User\\Downloads\\test.igc", "MYPASS", "MYUSER");
async Task UploadFileAsync(string filePath, string user, string pass)
{
HttpClient client = new HttpClient();
string igcData = File.ReadAllText(filePath);
var url = "http://www.paraglidingforum.com/modules/leonardo/flight_submit.php";
var formData = new Dictionary<string, string>
{
{ "user", user },
{ "pass", pass }
};
var content = new FormUrlEncodedContent(formData);
var response = await client.PostAsync(url, content);
response.EnsureSuccessStatusCode();
var responseContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Response: {responseContent}"); // >>Invalid user data
}
因为我可以让它通过 reqbin 接受用户数据,所以在从控制台应用程序发送时,我一定不能在表单中设置正确的属性,但我已经尝试了各种方式,但没有任何运气。总是相同的“无效用户数据”,这让我认为服务器没有收到它,因为我确信 id+pw 是正确的。
编辑:此 html 也接受用户,并且仅在文件数据丢失时失败。
<html >
<body>
<form action="https://www.paraglidingforum.com/modules/leonardo/flight_submit.php" method="post"
enctype="multipart/form-data" >
user: <input type="text" name="user" value="MYUSER">
<br>
pass: <input type="password" name="pass" value="MYPASS">
<br>
<input type="submit" value="Send">
</form> </body> </html>
我在这里做错了什么明显的事情吗?
如果您使用 Postman 等方式发送请求,您将看到如下内容:
因此,一个
POST
请求会立即重定向到 https
,但是,GET
不是 POST
。 GET
请求将无法合法地携带主体,因此可能没有任何凭据,因此身份验证失败。
如果您直接发布到
https
网址,https://www.paraglidingforum.com/modules/leonardo/flight_submit.php
,它会避免重定向并按预期工作。
所以,C# 代码没有任何问题,只是 URL 错误。默认情况下,
HttpClient
将通过默认处理程序的 AllowAutoRedirect
属性进行重定向。
我对 http 重定向的了解不是很多,但它是下一步该去哪里的指示。如果
POST
请求自动转发其包含的数据,这将是一个明显的安全风险,这就是为什么您无法将 POST
重定向到不同 url 上的另一个 POST
,并且会遵循重定向加上GET
。在此 API 的情况下,它仍然在 GET
端点上响应,但是当您没有向其发送任何凭据时(GET
请求无法根据规范发送正文),API 的响应就像您已发送没有。