0

我正在考虑使用 MKNetworkKit 作为 iOS 应用程序网络操作的基础。我对使用 initWithHostName:customerHeaders: 和 initWithHostName: apiPath:customerHeaders: 方法有点困惑。

在应用程序中,我需要与许多主机通信,它们有不同的方式来指定主机名和 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”。或“服务 B”。到主机名?我能看到的唯一方法是创建两个单独的 MKEngine 实例,一个用于“serviceA”,一个用于“serviceB”。是这样吗?

我是否遗漏了什么,或者有没有办法在调用 initWithHostName:apiPath:customerHeaders: 之后将服务添加到域名?

在此先感谢您的任何建议。最好的戴夫

4

2 回答 2

0

对于 HostNameY.com,您是对的。服务名称可以是路径的一部分。

正如您所提到的,您应该使用多个 MKEngine 实例来管理 HostNameX.com。

为什么要使用多个实例:主机名是 MKNetworkEngine 的私有属性,更改主机名的唯一方法是创建一个新的 MKNetworkEngine 实例(不修改 MKNetworkEngine)。MKNetworkEngine 使用主机名属性来观察可达性变化和冻结/恢复操作。如果您在运行时更改单个 MKNetworkEngine 实例的主机名(例如,通过公开 hostname 属性),此功能将无法在所有情况下正常工作。看看 MKNetworkEngine.m 中的 freezeOperations(当你失去网络时调用)方法。它检查操作 url 是否包含当前主机名。如果您更改了主机名并且该操作是为另一台主机创建的,则该操作将不会被存档,以便稍后在网络恢复时恢复它。

于 2014-02-03T15:50:57.633 回答
0

我通过使用 operationWithURLString 并构建自己的 URL 字符串解决了这个问题。无论如何,对我来说,这似乎是一个比分配多个 MKEngine 实例来处理可以作为参数传递的东西更好的解决方案。这样,我还可以将路径组件以及参数附加到 URL 字符串,例如:

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

这是作为 POST 而不是 GET 的有效 URL?

于 2014-02-04T00:57:00.283 回答