YTKBaseRequest的requestSerializerType属性默认值是YTKRequestSerializerTypeHTTP,对应的Content-Type类型是application/x-www-form-urlencoded,form表单数据需要被编码为key/value格式发送到后台,一般的使用方式如下(以编辑车牌接口为例):
@implementation SCCarParkUpdateCarRelationAPI
- (NSString *)requestUrl
{
return [NSString stringWithFormat:@"carParkApplication/%@/updateCarRelation", self.orderId];
}
- (YTKRequestMethod)requestMethod
{
return YTKRequestMethodPOST;
}
- (id)requestArgument
{
return self.params;
}
- (void)setCarLicenceList:(NSArray *)carLicenceList
{
// 服务列表信息
NSData *carLicenceListData = [NSJSONSerialization dataWithJSONObject:carLicenceList options:NSJSONWritingPrettyPrinted error:nil];
NSString *carLicenceListStr = [[NSString alloc] initWithData:carLicenceListData encoding:NSUTF8StringEncoding];
[self.params setValue:carLicenceListStr forKey:@"carLicenceList"];
}
@end
使用json方式发送数据到后台: 重写requestSerializerType方法,返回YTKRequestSerializerTypeJSON;然后requestArgument方法直接返回对象即可,如下:
@implementation SCCarParkUpdateCarRelationAPI
- (NSString *)requestUrl
{
return [NSString stringWithFormat:@"carParkApplication/%@/updateCarRelation", self.orderId];
}
- (YTKRequestMethod)requestMethod
{
return YTKRequestMethodPOST;
}
- (id)requestArgument
{
return self.carLicenceList;
}
- (YTKRequestSerializerType)requestSerializerType
{
return YTKRequestSerializerTypeJSON;
}
需要注意的是:
requestArgument方法必须返回能转化成json的对象,要求如下:
顶层对象必须是NSArray或者NSDictionary
所有的对象必须是NSString、NSNumber、NSArray、NSDictionary、NSNull的实例
所有NSDictionary的key必须是NSString类型
数字对象不能是非数值或无穷
还有一点,如果使用MJExtension中的mj_jsonObject把对象转换成json对象时,必须保证该对象不遵守任何协议,不然转换是不成功的,issue请见:https://github.com/CoderMJLee/MJExtension/issues/649
其它注意事项:
其它注意事项:
1.application/json可使用的http方法有post/put/delete。
get操作没有body部分,只能以key/value形式传递参数拼接在url中
post/put/delete有body部分,与服务器传递信息,都放在body中
2.是否使用application/json方式进行传值,需要与后台约定好
3.可对单个接口使用application/json方式进行传值,不影响到其它的接口
4.当application/json方式进行传值时,后台框架上使用了@RequestBody注解,读取请求body里面的值直接映射成参数,框架完成了这个事。