美文网首页程序员iOS Developer
关于iOS移动端向Java服务器提交文件数据的一个坑

关于iOS移动端向Java服务器提交文件数据的一个坑

作者: Sober_DeTong | 来源:发表于2017-06-13 15:29 被阅读348次

之前在做一个图片上传的功能时,由于是和新的同事进行对接,我居然没有开始就用封装好的方法!现在想想如果不是这样,也不能对HTTP的认识更加深刻了。而且还小小的了解了一下Java服务器的后台知识。

最原先我是将参数以及文件内容放在了HTTPBody里。
然后发出的报文其实就跟这个文章里面介绍的一样了:iOS POST 至 Java后台

但是失败了。。。而且返回的错误是服务器的错误码,好像是415吧~ 这样的话,说明同事的那个方法都没有进去。那么,有可能就是参数的问题。

后来让同事分别多写了两个方法,一个是只传参数,一个是只传文件的方法。测试之后发现只传参数的那个方法是可以调通的。

仔细分析两者的报文,再加上对比之前Web端的请求报文。发现问题应该是出现在了HTTP表单中的Content-Type这个字段里。
先附上一个前些日子收藏的关于HTTP协议的一篇帖子:HTTP协议详解

一般我们使用iOS请求网络的原生方法,或者使用AFNetworking时,如果没有特殊写明Content-Type这个字段的值,那么默认的应该就是:application/x-www-form-urlencoded这个值。比如下图


request_header.png

这种情况下的GET请求呢,会把所有参数转换为一个字符串,然后拼接在请求的地址后面,用?分割。如果是POST请求,会将数据封装到HTTPBody里面。

如果在请求里面有文件的话,那么你的Content-Type的值就不能是默认的值了,而应该是:multipart/form-data。比如下图


图片.png

而报文呢,也是有所不同,比如下图:

图片.png

图中上面的红框是普通的参数封装的样子,下面的红框是文件类型的参数封装的样子,下面那些乱码就是文件的Data流了。

那么,果断按照这种格式向服务器发起请求!
结果,出错了。
为什么呢?

和同事沟通过后发现,在这个接口的方法上方,有一个很显眼的关键字。
@RequestBody
以及@RequestMapping(value = "*********",consumes = 'application/json')
比如下图:

java_method.png

后台使用的是SpringMVC 的架构。

这样的设置,意味着接收的数据是json格式的字符串。然后将这个字符串封装到指定的对象里。也就是图中的
NativeReplayPo replay这个对象里。

将其删掉,重新请求,轻轻松松的就成功了。


经过这次风波之后,真是感慨,这个世界上如果有比女人更难懂的,那应该就是HTTP了。
也是自己基础的知识不够完善。写下此文,以示警戒。


情人总是分分合合,而我们却是越爱越深...

相关文章

  • 关于iOS移动端向Java服务器提交文件数据的一个坑

    之前在做一个图片上传的功能时,由于是和新的同事进行对接,我居然没有开始就用封装好的方法!现在想想如果不是这样,也不...

  • Multipart/form-data POST文件上传详解

    提交时会向服务器端发出这样的数据(已经去除部分不相关的头信息),数据如下: 基本结构 iOS 试例代码 [基础代码...

  • 技术栈

    移动端:iOS 前端: 后端:Java EE 数据库:MySQL 运维:Linux

  • 基本概念

    客户端(Client):移动应用(iOS、android等应用)服务器(Server):为客户端提供服务、提供数据...

  • AFNetworking简单的文件上传Demo,服务端为Java

    java servlet实现服务端:接收文件上传,并保存到服务器 web端测试接口 iOS 使用AFNetwork...

  • GET和POST的区别是什么??

    get是从服务器上获取数据,post是向服务器传送数据, 在客户端,get方式是通过url提交数据,并且数据可以在...

  • 关于http请求与AFNetworking

    前言 众所周知,在我们移动端与服务器端进行数据请求提交时,需要根据服务器端要求的请求方式去调用接口,所以在开发中会...

  • dwr入门教程

    dwr实现java服务器端向客户端推送消息 Ajax可以异步无刷新的从服务器端加载最新的数据 服务器主动向客户端发...

  • iOS,一行代码进行RSA、DES 、AES加密、解密及MD5加

    最近做了一个移动项目,是有服务器和客户端类型的项目,客户端是要登录才行的,服务器也会返回数据,服务器是用Java开...

  • HTML表单的用法

    HTML表单用于用户向服务器端提交表单数据,用法为 提交的表单数据区域 。用form标签包裹着表单控件,如inpu...

网友评论

    本文标题:关于iOS移动端向Java服务器提交文件数据的一个坑

    本文链接:https://www.haomeiwen.com/subject/kbmdqxtx.html