首页 > 解决方案 > 如何在 Xamarin 的同一 API 中传递表单数据和 json?

问题描述

我在 Xamarin 中有一个 API 方法,它使用 .NET Core 作为后端,我想用它来传输表单数据和 JSON 格式。我已经阅读了一些示例,并试图找到一种使其工作的方法。目前我有这个:

 public async Task AddUser(User user, MediaFile file)
    {
        string userRegisterUrl = "http://10.0.2.2:53547/api/PostUser";
        var json = JsonConvert.SerializeObject(user);
        HttpClientHandler clientHandler = new HttpClientHandler();
        clientHandler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; };
        var formData = new MultipartFormDataContent();
        formData.Add(new StreamContent(file.GetStream()),"file",string.Format("{0}.png",Guid.NewGuid()));
                formData.Add(new StringContent(json),"user");
                using (HttpClient client = new HttpClient(clientHandler))
                {
                    var response = await client.PostAsync(userRegisterUrl, formData);
                    string result = await response.Content.ReadAsStringAsync();
                    if(response.IsSuccessStatusCode)
                    {
                       
                    }
                }
    }

问题是,无论我做什么,我都会不断收到此错误:“415 Unsupported Media Type”。现在我知道它想说的是服务器不会接受有效负载格式,因为它不受支持,但我没有知道如何做到这一点,它不需要我安装外部 nuget 包来实现它。我知道这是可能的,我尝试过的如下:

  1. 首先,我尝试创建一个 HttpContent,它将媒体文件作为流获取,并使用“form-data”的 ContentDispositionHeaderValue 和“application/octet-stream”的 MediaTypeHeaderValue 添加了一些标头。我将序列化它的 json 格式正如我在我的方法中所做的那样,并将其传递给 MultipartFormDataContent 值,但没有任何成功,因为我得到了上面提到的错误。
  2. 第二次尝试我没有将任何标题传递给媒体文件,json 对象保持不变,我使用 try catch 块来传递内容但没有任何运气,因为它给了我同样的错误。

上面的方法是我实现的最后一个方法,这就是我在服务器端的方法:

    [HttpPost]
    public async Task<ActionResult<User>> PostUser(User user,IFormFile file)
    {
      

        if (string.IsNullOrWhiteSpace(_env.WebRootPath))
        {
            _env.WebRootPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot");
        }
        if(user!=null)
        { 
        _context.User.Add(user);
            var users = Path.Combine(_env.WebRootPath, "uploads", user.Name);
            if (!Directory.Exists(users)) Directory.CreateDirectory(users);
            if (file.Length > 0)
            {
                using (var fileStream = new FileStream(Path.Combine(users, file.FileName), FileMode.Create))
                {
                    await file.CopyToAsync(fileStream);
                }
            }
        }
        await _context.SaveChangesAsync();
        return CreatedAtAction("GetUser", new { id = user.IdUser }, user);
     
    }

最初我将两种方法分开,一种用于上传图像,另一种用于存储用户数据,但我想在每次注册新用户时使用用户名创建一个文件夹,有人建议我应该合并这两种方法。如何我无需处理不受支持的格式即可达到预期的效果?

标签: c#apiasp.net-corexamarin

解决方案


Alternatif 解决方案,您可以使用Refit来简化您的请求。它可以在任何带有/不带的 xamarin 表单项目中使用ReactiveUI


推荐阅读