本主题介绍如何配置通过 HTTP 代理(根据“Host”头部路由通讯报文)发送和接收消息的消息代理。HTTP 正向代理十分适用于后端服务端点不可配置的移动应用程序,或者没有配置选项可用于更改连接后端服务的主机和端口的被测应用程序。
章节目录:
连接设置
要指定 HTTP 正向代理连接选项,请设置以下服务和监听内容。
代理设置(传入)
这些设置指定来自客户端的消息应连接到的位置,以便与被测应用程序进行通信。
正向代理 | 您可以从菜单中选择创建代理时定义的正向代理 HTTP 监听器(请参阅创建代理),也可以添加新的正向代理 HTTP 监听器。 从该对话框添加正向代理 HTTP 监听器:
|
---|---|
主机 | 输入要监控通讯报文的服务的主机名。这将决定哪些主机会被录制,发送到实时服务或发送到虚拟资产。 要监控所有通讯报文,请从菜单中选择[全部]。 |
路径 | 输入要监控资源的路径。这将与在主机字段中输入的内容配合使用,以匹配传入请求。 不允许使用通配符。如需匹配主机上的所有路径,请将此字段留空或从菜单中选择[全部]。 如果配置了多个可与传入请求匹配的代理连接,则会选择主机匹配度最高和匹配路径最长的代理连接,其中主机匹配度是权重较大的因素。例如,假设传入的目标 URL 是
在这种情况下,4 号代理会被选中,因为尽管 2 号代理有更精确的路径匹配,但 4 号代理有更好的主机匹配,而且不像 3 号代理,至少有部分路径匹配。 |
主要连接(传出)和次要连接(传出)
服务 URL | 包含目标应用程序的完整 URL(包括服务主机,服务端口和转发路径)。您可以在此处输入完整的 URL 和/或在相关字段中编辑特定组件。一个区域的更新将传播到另一个区域(例如,如果您修改了服务 URL 字段中的端口,服务端口字段中的值将自动更新)。 |
---|---|
服务主机 | 输入服务所在机器的主机名。这是代理将发送消息的机器。 如果希望代理转发到本地服务器上的虚拟资产而不使用 HTTP 连接,请输入 host.virt.internal、localhost 或 127.0.0.1,而不是实际主机名。使用 localhost 或 127.0.0.1 时,服务端口必须与 Virtualize 部署的端口一致;使用 host.virt.internal 时,则不使用该服务端口。例如,部署在 服务主机也可设置为 [Passthrough](将请求路由到客户端请求的原始主机)或 [Virtualize](将请求路由到 Virtualize,由虚拟资产或消息代理处理)。从菜单中选择任一选项。 |
服务端口 | 输入服务正在监听的端口。这是代理将发送消息的端口。 |
服务转发路径 | (可选项)输入代理应该其接收到的消息转发到的路径。如果为空,代理将不加修改,沿原传入路径转发消息。 如果代理向 localhost 发送信息,则必须输入服务转发路径,因为代理不允许转发到代理本身。 如果服务转发路径发送重定向,代理将跟随重定向并进行响应。它不会将重定向传递回客户端。 |
选项
模式:当存在主要连接和次要连接时,您可以设置活动转发连接。例如,在录制会话期间,消息代理可能转发到实时服务作为主要连接,并回退到虚拟服务作为次要连接。在这种情况下,可以将 HTTP 模式设置为主要并启用所选模式故障时使用其他连接。
完成录制并生成新的虚拟资产后,您可能想要重新配置代理,使其优先转发到虚拟服务,并在发生故障时回退到实时服务。右键点击代理并将 HTTP 模式切换为“次要”,即可快速应用这一更改。运行时将对故障转移进行相应调整。
所选模式故障时使用其他连接:如果想在活动连接(由上面选择的模式决定)故障时将通讯报文重定向到备用代理端点,请启用此选项。如果响应码为 400 或更高级别,则该连接被视为“失败”。
绕过代理故障转移
通过启用跳过消息代理故障转移,可将消息响应器配置为绕过内部路由消息的代理故障转移。
如果未启用此选项,将使用活动连接进行录制。
如果启用了该选项,请从录制菜单选择录制选项:
- 两种连接:录制主要和次要连接的通讯报文。活动连接的错误消息不会被录制;相反,这些消息将被发送到备用连接并录制响应。次要连接报告的错误将被录制。
- 仅限主要连接:录制活动连接的通讯报文。不录制错误。
- 仅限次要连接:录制备用连接的通讯报文,包括错误。
示例:向服务发送通讯报文
假设我们要为通常在 http://parabank.parasoft.com
访问的服务创建一条消息。我们可以使用以下设置创建 HTTP 正向代理:
- 主机:parabank.parasoft.com
- 服务主机:[Passthrough]
该配置将监控发送到主机 parabank.parasoft.com
的通讯报文,并像往常一样将通讯报文传递到实时服务。
如果我们想将通讯报文重定向到不同的服务主机和端口,可以按以下方式更改代理的配置:
- 服务主机: coyote.parasoft.com
- 服务端口:8080
- 服务转发路径:[empty]
这会将 parabank.parasoft.com 的通讯报文路由到 coyote.parasoft.com:8080
上的其他服务。
示例:向虚拟资产发送通讯报文
代理还可以向虚拟资产发送通讯报文。通过使用本地虚拟主机(如 host.virt.internal
)或内建“[Virtualize]”选项作为服务主机,我们可以将通讯报文转发给本地服务器上的虚拟资产,无需消耗 HTTP 连接(更多信息,请参阅上文的主要连接(传出)和次要连接(传出))。
一种方法是将主要输出连接更改为 host.virt.internal
,从而将通讯报文发送给本地服务器上的虚拟资产:
- 服务主机:host.virt.internal
- 服务端口:9080
- 服务转发路径:/path
另外,由于默认情况下次要连接被配置为指向本地虚拟资产,因此另一种方法是简单地将模式从“主要”改为“次要”。
- 服务主机:[Virtualize]
- 服务转发路径:/path
- 模式:次要
安装 Parasoft 根证书
在移动仿真器上使用 HTTP 正向代理前,必须将 Parasoft 根证书作为受信任证书安装。如果没有安装证书颁发机构,浏览器将不认为连接是安全的,并可能拒绝连接。
Android 仿真器
该步骤假定您使用的是 Android Studio/Android Sdk,并且已在非生产构建上创建了 Android 虚拟设备(AVD)。此外:
- 已为 Parasoft 配置 AVD 的代理设置。有关通过代理使用仿真器的更多信息,请参阅 https://developer.android.com/studio/run/emulator-networking#proxy。
- Android Sdk 仿真器和 adb 可执行文件已添加到 $PATH 变量中。
由于 Android 中的 CA 证书是以文件扩展名为 .0 的哈希名称存储的,因此您需要复制并重命名 Parasoft 证书。为此,请打开命令提示符并导航至 <VIRT-INSTALL-DIR>/plugins/com.parasoft.ptest.libs.web_<VERSION>/root/lib
,然后运行以下命令:
hashed_name=`openssl x509 -inform PEM -subject_hash_old -in parasoft.cer | head -1` && cp parasoft.cer $hashed_name.0
您需要将 CA 证书的 hash.0 版本放入 Android 文件系统中的系统证书库中,该库位于 /system/etc/security/cacerts/
。不过,/system
分区默认以只读方式挂载,因此首先需要更改其权限。具体方式取决于您使用的仿真器版本。
API Level 29 或更高
从 API Level 29 开始,“/”分区无法正常挂载读写权限。Google 提供了一种解决方法(更多信息请参阅 https://android.googlesource.com/platform/system/core/+/master/fs_mgr/README.overlayfs.md),但部分用户发现这会导致仿真器陷入启动循环。如果是这种情况,您可以尝试下面详细说明的解决方法:
要使用证书,必须使用 -writable-system
选项启动仿真器,否则 Android 会加载一个“干净”的系统镜像。
启动 AVD:
emulator -avd <AVD_NAME> -writable-system
- 如果不确定 AVD 的名称,可运行
emulator -list-avds
命令查看所有 AVD 的列表。
- 如果不确定 AVD 的名称,可运行
以 root 权限重启 adb:
adb root
禁用安全启动验证:
adb shell avbctl disable-verification
重启设备并以 root 权限重启 adb:
adb reboot adb root
以读写方式重新挂载分区:
adb remount
如果 adb 显示需要重启,请再次运行
adb reboot
和adb remount
。
推送证书的 hash.0 版本:
adb push <PATH_TO_CERT> /system/etc/security/cacerts
设置证书权限:
adb shell chmod 664 /system/etc/security/cacerts/<NAME_OF_HASH.0_CERT>
再次重启设备:
adb reboot
API Level 28 或更低
要使用证书,必须使用 -writable-system
选项启动仿真器,否则 Android 会加载一个“干净”的系统镜像。
启动 AVD:
emulator -avd <AVD_NAME> -writable-system
- 如果不确定 AVD 的名称,可运行
emulator -list-avds
命令查看所有 AVD 的列表。
- 如果不确定 AVD 的名称,可运行
以 root 权限重启 adb:
adb root
以读写方式重新挂载分区:
adb remount
如果 adb 显示需要重启,请再次运行
adb reboot
和adb remount
。
推送证书的 hash.0 版本:
adb push <PATH_TO_CERT> /system/etc/security/cacerts
设置证书权限:
adb shell chmod 664 /system/etc/security/cacerts/<NAME_OF_HASH.0_CERT>
再次重启设备:
adb reboot
iOS 仿真器
- 将 parasoft.cer 托管到文件服务器上,或通过电子邮件将 parasoft.cer 发送到 iOS 仿真器可以接收的地址。您可以在
<VIRT_INSTALL_DIR>/plugins/com.parasoft.ptest.libs.web_<version>/root/lib
中找到 parasoft.cer。 - 打开浏览器,进入 parasoft.cer 文件的 URL 或打开电子邮件,按照对话框提示接受配置文件。
- 前往
Settings > General > Device Management
,然后选择 Parasoft Root Certificate Authority。点击安装程序对话框,保留默认设置。
在最近的 iOS 版本中,还需要启用对 Parasoft 根证书的完全信任。操作步骤:
- 前往
Settings > General > About > Certificate Trust Settings
。 - 在 Enable full trust for root certificates 下,启用对 Parasoft 证书的信任。