我在考虑使用MKNetworkKit作为iOS应用程序的网络操作的基础。我对使用initWithHostName:customerHeaders:和initWithHostName:apiPath:customerHeaders:方法感到困惑。
在App中,我需要与多个主机通信,并且它们有不同的方式来指定主机名和URL。例如:
HostNameX.com - HostX的域名,
第一个主机将服务预先添加到主机名,如下所示:
serviceA.HostNameX.com?someparam=value ServiceA的路径(返回信息) serviceB.HostNameX.com?someparam=value ServiceB的路径(返回信息)
HostNameY.com - HostY的域名
第二个主机将服务或命令附加到主机名,如下所示:
HostNameY.com/serviceA?someparam = value ServiceA的路径(返回信息) HostNameY.com/serviceB?someparam = value ServiceB的路径(返回信息)
对于HostNameY.com的情况,我考虑创建一个MKEngine实例,然后将“serviceA?someparam = value”或“serviceB?someparam = value”字符串作为Path参数传递给operationWithPath:params:httpMethod :ssl:方法。
这对我想做的事情很有效,但是对于HostNameX.com,我不知道如何预置“serviceA”。或“serviceB。”到主机名?我能看到的唯一方法是为“serviceA”创建两个单独的MKEngine实例,为“serviceB”创建一个MKEngine实例。是这种情况吗?
在调用initWithHostName之后,我是否遗漏了某些内容或是否有能够将服务添加到域名的方法:apiPath:customerHeaders:?
提前感谢任何建议。 祝一切顺利 戴夫
答案 0 :(得分:0)
对于HostNameY.com,你是对的。服务名称可以是路径的一部分。
正如您所提到的,您应该使用MKEngine的多个实例来管理HostNameX.com。
为什么要使用多个实例: Hostname是MKNetworkEngine的私有属性,更改主机名的唯一方法是创建MKNetworkEngine的新实例(不修改MKNetworkEngine)。 MKNetworkEngine使用Hostname属性来观察可达性更改和冻结/恢复操作。如果在运行时为单个MKNetworkEngine实例更改主机名(例如,通过将hostname属性设为public),则此功能在所有情况下都无法正常工作。只需看一下MKNetworkEngine.m中的freezeOperations(当你松散网络时调用)方法。它检查是否和操作url包含当前主机名。如果您更改了主机名并且为其他主机创建了操作,则该操作将不会存档,以便稍后在网络恢复时进行还原。
答案 1 :(得分:0)
我通过使用operationWithURLString并构建自己的URL String解决了这个问题。无论如何,对我来说,这似乎是一个比分配一些MKEngine实例只是为了处理可以作为参数传递的东西更好的解决方案。这样我也可以将路径组件和参数附加到URL String,例如:
http://serviceA.hostname.com/fred/simmons?isvip=true&hasBooked=false
有趣的是,传递给operationWithURLString的参数字典:params:httpMethod:有两种工作方式:
如果httpMethod是GET,那么字典用于传递URL中的参数,如果httpMethod是POST或PUT(或DELETE?)则字典被格式化并作为请求体发送。
问题 - 使用带参数的POST命令是否有效?
例如:
http://bookingservice.hostname.com/bookings?isvip=true&lastname=simmons
这是一个有效的URL作为POST而不是GET吗?