如何为带有可选 URL 参数的 GET 请求映射不同的 JSON 响应
Posted
技术标签:
【中文标题】如何为带有可选 URL 参数的 GET 请求映射不同的 JSON 响应【英文标题】:How to map a different JSON response for GET request with optional URL parameters 【发布时间】:2018-04-19 07:41:05 【问题描述】:我需要使用可选的 URL 参数对 url 执行 GET 请求。
基本 URL 类似于 http://host/user/explore
,可以选择查询 http://host/user/explore?who=VALUE&category=VALUE&service=VALUE
以获得更准确的结果。
对于第一种情况,响应带有根键,例如:
"professionals": [
"_id": "59e8576cb524cf44a435844b"
],
"salons": [
"_id": "59e857bbb524cf44a4358454"
]
而且我可以通过设置响应描述符来成功映射响应,例如:
RKResponseDescriptor *response = [RKResponseDescriptor
responseDescriptorWithMapping:[Explore map1]
method:RKRequestMethodGET
pathPattern:@"user/explore"
keyPath:nil
statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
return response;
(请注意,[Explore map1]
用于映射“Professional”的 NSArray 和另一个由“Salon”NSObjects 组成的 NSArray)
但是,当我查询 http://host/user/explore?who=VALUE&category=VALUE&service=VALUE
时,我的响应 JSON 变为:
"_id": "59f6f9fc36e51720da2e85f4"
,
"_id": "92x2f9fc36e51720da2e66d5"
实际返回的对象都是相同的类型(并且在根处不再有键)。
所以现在很明显,我的RKResponseDescriptor
和RKObjectMapping
未能正确处理此案。
我已经研究过使用 RKDynamicMapping
或 RKRoute
并且无法真正了解它们的工作原理,或者它们是否适用于我的情况...
【问题讨论】:
【参考方案1】:你的网址是:http://host/user/explore?who=VALUE&category=VALUE&service=VALUE 所以就这样做吧:
let postMapping: RKObjectMapping = RKObjectMapping(for: GetFoo.self)
postMapping.addAttributeMappings(from:["who","category","service"])
// Define response decriptor
let statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClass.successful)
let resDescriptor = RKResponseDescriptor(mapping: postMapping, method: RKRequestMethod.GET, pathPattern: "user/explore", keyPath: nil, statusCodes: statusCodes)
// Create object manager
let url = URL(string: "http://host")
let jsonPlaceholderManager = RKObjectManager(baseURL: url)
jsonPlaceholderManager?.addResponseDescriptor(resDescriptor)
RKObjectManager.setShared(jsonPlaceholderManager)
RKObjectManager.shared().getObjectsAtPath("/user/explore?who=VALUE&category=VALUE&service=VALUE", parameters: nil, success: (operation, mappingResult) -> Void in
let dataResponse = operation?.httpRequestOperation.responseData
let jsonData = try? JSONSerialization.jsonObject(with: dataResponse!, options: .mutableContainers) as? NSMutableDictionary
print(dataResponse)
【讨论】:
以上是关于如何为带有可选 URL 参数的 GET 请求映射不同的 JSON 响应的主要内容,如果未能解决你的问题,请参考以下文章