C#向PHP API发送POST数据返回调用API错误的问题排查
问题定位
你的接口调用失败和Item类的声明没有关系,核心原因是请求提交格式和PHP后端的接收逻辑不匹配:
- PHP端通过
$_POST读取普通提交字段、通过$_FILES读取上传的图片文件,这种写法仅支持multipart/form-data(带文件上传的表单格式)或application/x-www-form-urlencoded(普通表单格式)的POST请求 - 你当前C#代码将数据序列化为JSON后,以
application/json格式提交,PHP默认不会把JSON请求体解析填充到$_POST全局变量中,因此isset($_POST["nombre"])等所有字段校验都不通过,直接返回Error al llamar a la API错误 - 除此之外你的C#代码没有提交
foto对应的文件内容,就算格式调整正确,后续也会触发文件上传校验失败的错误
可正常调用接口的HTML表单参考:
修复方案
放弃JSON提交方式,改用MultipartFormDataContent构造和HTML表单一致的请求格式,同时补充文件上传内容,参考代码如下:
private async Task SignUpApiPost() { // 建议全局复用HttpClient,不要每次请求新建实例,避免套接字端口耗尽 using var httpClient = new HttpClient(); using var formContent = new MultipartFormDataContent(); // 逐个添加表单字段,字段名必须和PHP端$_POST读取的键名完全一致 formContent.Add(new StringContent("Eric", Encoding.UTF8), "nombre"); formContent.Add(new StringContent("Pino", Encoding.UTF8), "ape"); formContent.Add(new StringContent("ericpinodiaz@gmail.com", Encoding.UTF8), "email"); formContent.Add(new StringContent("M2022", Encoding.UTF8), "pass"); // 添加foto字段对应的上传文件,替换为你实际的文件路径/流 var fileStream = File.OpenRead("default.jpeg"); formContent.Add(new StreamContent(fileStream), "foto", "default.jpeg"); // 发送请求 var response = await httpClient.PostAsync("https://app.domainexample.com/rest/add.php", formContent); if (response.StatusCode == System.Net.HttpStatusCode.OK) { // 编写请求成功后的业务逻辑 } }
注意事项
- 你定义的
Root类在当前场景下完全不需要使用,PHP端接收的是平铺的表单字段,不是嵌套结构的JSON数据,不需要做JSON序列化操作 - 如果暂时不需要实际上传图片,需要同步修改PHP端的
subirImagen方法,允许空文件或自动填充默认图片路径,否则会卡在文件校验步骤返回Error con el archivo相关错误 - 生产环境建议将HttpClient声明为全局单例复用,不要在每次请求时新建实例
内容的提问来源于stack exchange,提问作者Fran Pino
相关产品推荐
相关产品推荐


