Xamarin.Forms应用发送multipart form-data POST请求数据未提交问题
问题分析与解决方案
你这是踩了个典型的误区:虽然把StringContent的媒体类型标成了multipart/form-data,但这根本不是构造multipart请求的正确姿势。StringContent只是把JSON字符串原封不动打包,服务端没法按照multipart的规则解析到你的数据,自然就出现“返回成功但没收到内容”的情况了。
修正方案
要正确发送multipart/form-data格式的请求,得用MultipartFormDataContent类来构建请求体,而不是硬套StringContent。下面是调整后的完整代码:
public class Post { public string ConnectionId { get; set; } public string HolderFirstName { get; set; } } // 建议把HttpClient作为类成员复用,避免每次请求都创建新实例浪费资源 private readonly HttpClient _client = new HttpClient(); public async void SendProof(object sender, EventArgs e) { try { Uri URL = new Uri("http://11.222.333.44:4000/api/v1/Proof/SendProofNameRequest"); var post = new Post { ConnectionId = "9c12dba2-6cb9-4382-8c96-f1708a7e8816", HolderFirstName = "Carl Dreyer" }; // 构建标准的multipart/form-data请求内容 var multipartContent = new MultipartFormDataContent(); // 逐个添加表单字段,第二个参数要和服务端API要求的字段名完全匹配 multipartContent.Add(new StringContent(post.ConnectionId), "ConnectionId"); multipartContent.Add(new StringContent(post.HolderFirstName), "HolderFirstName"); var response = await _client.PostAsync(URL, multipartContent); if (response.IsSuccessStatusCode) { await DialogService.AlertAsync("Credential Proof Sent Successfully!"); } else { // 新增非成功状态码的处理,方便排查问题 var errorDetail = await response.Content.ReadAsStringAsync(); await DialogService.AlertAsync($"Request failed: {response.StatusCode} - {errorDetail}"); } } catch(Exception error) { await DialogService.AlertAsync(error.Message); } } public ICommand SendProofCommand => new Command(() => SendProof(default, default));
关键点说明
MultipartFormDataContent会自动生成符合规范的边界分隔符,服务端能通过这个边界区分不同的表单字段,这是StringContent做不到的。- 添加字段时,第二个参数的字段名必须和服务端API接收的参数名完全一致,不然服务端找不到对应的数据。
- 把
HttpClient作为类成员复用是.NET的最佳实践,频繁创建实例会导致不必要的资源消耗。
这样修改后,服务端应该就能正确接收到你的表单数据了。
内容的提问来源于stack exchange,提问作者user14139029
相关产品推荐
相关产品推荐

