【问题标题】:Flutter return 415 Unsupported Media Type with http.MultipartRequestFlutter 使用 http.MultipartRequest 返回 415 Unsupported Media Type
【发布时间】:2022-10-04 22:38:05
【问题描述】:

我想使用 http.MultipartRequest 添加带有文件附件的帖子。这是颤振中的代码:

Future<String> savePost({String content = '', XFile? file}) async{
    String messageRes = '';
    try {
      final uri = Uri.parse('$urlBase/api/posts');
      Map<String, String> headers= <String,String>{
        'Authorization':'Bearer ${Global.user!.token}',
        'content-type': 'application/json; charset=UTF-8;',
        'Accept' : 'application/json',
      };

      Map<String, String> data = {
        "content": content
      };

      var request = http.MultipartRequest('POST', uri)
        ..headers.addAll(headers)
      ..fields.addAll(data);

      if(file != null){
        request.files.add(
            http.MultipartFile(
                'picture',
                File(file.path).readAsBytes().asStream(),
                File(file.path).lengthSync(),
                filename: file.name
            )
        );
      }

      var res = await request.send();
      if(res.statusCode == 200){
        messageRes = '200';
      }else{
        messageRes = '${res.statusCode} ${res.reasonPhrase}';
      }
    } catch (e) {
      messageRes = e.toString();
    }
    return messageRes;
  }

我使用的 Beckend 是 .Net 6:

[HttpPost]
        // api/posts
        public async Task<IActionResult> AddPost(CreatePostDto createDto)
        {}

public class CreatePostDto
    {
        public string Content { get; set; }
    }

我用邮递员测试了api,一切都很好。但是当使用上面的代码使用颤振时,我得到错误 415。请帮助我我哪里出错了。

【问题讨论】:

    标签: .net flutter


    【解决方案1】:
        Future<String> savePost({String content = '', XFile? file}) async {
        String messageRes = '';
        try {
          final uri = Uri.parse('$urlBase/api/posts');
          Map<String, String> headers = <String, String>{
            'Authorization': 'Bearer ${Global.user!.token}',
            'content-type': 'application/json; charset=UTF-8;',
            'Accept': 'application/json',
          };
    
         
    
          var request = http.MultipartRequest('POST', uri)..headers.addAll(headers);
    
          request.fields['createDto'] = (content);
    
          if (file != null) {
            request.files.add(http.MultipartFile.fromBytes('picture', await File(file.path).readAsBytes(), filename: file.name));
          }
    
          var res = await request.send();
          if (res.statusCode == 200) {
            messageRes = '200';
          } else {
            messageRes = '${res.statusCode} ${res.reasonPhrase}';
          }
        } catch (e) {
          messageRes = e.toString();
        }
        return messageRes;
      }
    

    尝试这个

    [HttpPost("AddPost")]
    public async Task<IActionResult> AddPost([FromForm] IFormFile picture,string content)
     {
        var contentValue =  Request.Form.FirstOrDefault(x=>x.Key == "createDto").Value;
             
        CreatePostDto createPostDto = new CreatePostDto{
           content:contentValue
      };
    

    }

    【讨论】:

    • 我使用 AddPost(string content) 它工作正常。但我不喜欢那样做。我想在 BE 传递一个身体类型 (CreatePostDto createDto)
    • 我也一直在尝试这样做,但我没有成功。
    • 我编辑了您可能想再次查看的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 2021-07-16
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多