向本地服务器POST请求时接收空字符串的问题排查
问题原因及解决方案
核心问题
你用WebClient.UploadValues发送请求时,它默认会把NameValueCollection的数据编码成application/x-www-form-urlencoded格式,并设置对应的请求头。而PHP在接收到这种格式的POST请求时,会自动将数据解析到$_POST全局数组中,同时清空php://input的内容——这就是你获取到空字符串的原因。
解决方案一:PHP端直接使用$_POST获取数据
修改PHP接收代码,直接从$_POST中读取参数,无需读取php://input:
<?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { $username = $_POST['username'] ?? null; $password = $_POST['password'] ?? null; var_dump($username); var_dump($password); } else { http_response_code(405); echo "Это не POST"; } ?>
解决方案二:修改C#发送方式,适配php://input读取
如果你坚持要通过php://input获取数据,需要修改C#代码,手动构造url编码的字符串,并用UploadString发送,同时指定正确的Content-Type:
using (var wb = new WebClient()) { wb.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded"; string postData = "username=myUser&password=myPassword"; // 若参数包含特殊字符,用UrlEncode处理: // string postData = $"username={Uri.EscapeDataString("myUser")}&password={Uri.EscapeDataString("myPassword")}"; var response = wb.UploadString(url, "POST", postData); Console.WriteLine(response); }
此时PHP端原代码即可正常获取到php://input的内容。
内容的提问来源于stack exchange,提问作者Xlebushek
相关产品推荐
相关产品推荐

