AFNetworking 返回错误unsupported media type (415) 解决方案

当使用AFNetworking遇到415错误时,问题在于服务器要求Content-Type为application/json,但AFNetworking默认设置为application/x-www-form-urlencoded。解决方法是修改请求的Content-Type,确保与服务器要求一致,从而避免错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://stackoverflow.com/questions/21152847/how-to-post-data-using-afnetworking-2-0 

从这里可以知道,AFNetwoking的默认Content-Typeapplication/x-www-form-urlencodem。若服务器要求Content-Typeapplicaiton/json,为了和服务器对应,就必须修改AFNetworking的Content-Type。


关于Content-Type的概念和Post常见的的提交数据方式请见博客:https://www.imququ.com/post/four-ways-to-post-data-in-http.html。



简单来说,服务器通过识别Content-Type来识别传送的数据类型,分辨传送的数据到底是文本,图片或者是其他。如果服务器不识别对应的Content-Type,那么就会返回错误415.


修改Content-Type代码如下:


    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];



      修改后便可正常使用如下方法进行POST访问了,GET访问查看头文件选择对应方法即可:

- (AFHTTPRequestOperation *)POST:(NSString *)URLString
                      parameters:(NSDictionary *)parameters
                         success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
                         failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure

HTTP 415 Unsupported Media Type 错误通常出现在服务器无法处理请求中指定的媒体类型(Content-Type)。在 Apipost 中出现该错误,通常意味着客户端发送的 `Content-Type` 类型不被服务器支持,或者服务器没有配置适当的 `HttpMessageConverter` 来处理请求体中的特定媒体类型 [^1]。 ### 常见原因分析 1. **不支持的 Content-Type 类型** 服务器端可能没有配置处理 `application/octet-stream` 或其他特定 `Content-Type` 的能力。例如,Spring Boot 应用程序如果没有合适的 `@RequestBody` 消息转换器,则无法处理非标准媒体类型 [^1]。 2. **请求头中未正确设置 Content-Type** 如果请求头中缺少 `Content-Type` 字段,或者设置的类型与服务器预期不符,也可能导致该错误。 3. **后端未启用消息转换器** 在基于 Spring 的后端应用中,如果没有启用 `@EnableWebMvc` 或者缺少 `spring-webmvc` 依赖,可能导致默认的消息转换器未加载,从而无法解析请求体 [^1]。 4. **请求体为空或格式错误** 如果请求体为空,或者虽然设置了正确的 `Content-Type`,但请求体格式与该类型不匹配,也可能导致服务器拒绝处理。 ### 解决方法 #### 1. 检查并设置正确的 `Content-Type` 确保在 Apipost 的请求头(Headers)部分设置了正确的 `Content-Type`,例如: ```http Content-Type: application/json ``` 如果发送的是表单数据,则应设置为: ```http Content-Type: application/x-www-form-urlencoded ``` 如果是上传文件,则使用: ```http Content-Type: multipart/form-data ``` #### 2. 配置后端支持的 `HttpMessageConverter` 如果使用的是 Spring Boot 后端框架,可以通过添加自定义配置类来注册额外的 `HttpMessageConverter`。例如,支持 `application/octet-stream` 类型可以添加如下配置: ```java @Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(new ByteArrayHttpMessageConverter()); } } ``` #### 3. 检查依赖项 确保项目中包含了处理 JSON、XML 或其他格式的依赖。例如,Spring Boot 项目中如果缺少 `spring-webmvc` 或 `jackson-databind`,则可能无法解析 JSON 请求体。 #### 4. 检查请求体格式 确认请求体的内容与 `Content-Type` 匹配。例如,JSON 格式的请求体应符合 JSON 语法,而表单数据应为 `key=value&key2=value2` 的形式。 #### 5. 日志与调试 查看服务器端日志,确认是否抛出异常或警告信息,例如 `HttpMediaTypeNotSupportedException`,这有助于定位具体不支持的媒体类型。 ### 示例:在 Apipost 中设置正确请求头 在 Apipost 工具中,确保请求头部分设置如下: ```http Content-Type: application/json Accept: application/json ``` 请求体则应为合法的 JSON 格式: ```json { "name": "test", "value": "example" } ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值