Liferay Web Service


最近项目中需要在移动端(HTML5 页面)中调用 Liferay Portal 接口,奈何网上资料很少而且版本各异,所以就只能硬着头皮啃官方文档了…

这个东西都烂到没有人愿意翻译么 →_→

SOAP WEB SERVICES

您可以通过 HTTP 通过简单对象访问协议(SOAP)访问 Liferay 的服务。打包协议是 SOAP,传输协议是 HTTP。

Note:与身份验证相关的令牌必须伴随每个 Liferay web service 调用。有关详细信息,请阅读本章前面关于服务安全层的一节。

作为一个示例,让我们看看 Liferay 的 CompanyUserUserGroup portal 服务的 SOAP web service 类,以执行以下操作:

  1. 列出 User 测试所属的每个 UserGroup。
  2. 添加一个名为 MyGroup 的新 UserGroup。
  3. 将 portal 的管理用户添加到新用户组。出于演示目的,我们将使用电子邮件地址为 test@liferay.com 的管理用户。

我们将使用这些与 SOAP 相关的类:

import com.liferay.portal.model.CompanySoap;
import com.liferay.portal.model.UserGroupSoap;
import com.liferay.portal.service.http.CompanyServiceSoap;
import com.liferay.portal.service.http.CompanyServiceSoapServiceLocator;
import com.liferay.portal.service.http.UserGroupServiceSoap;
import com.liferay.portal.service.http.UserGroupServiceSoapServiceLocator;
import com.liferay.portal.service.http.UserServiceSoap;
import com.liferay.portal.service.http.UserServiceSoapServiceLocator;

您能看到 SOAP 相关类的命名约定吗?这些类都有后缀 -ServiceSoapServiceLocator-ServiceSoap-Soap-ServiceSoapServiceLocator 类通过您提供的服务 URL 查找 -ServiceSoapServiceSoap 类是每个服务的 Web Service 定义语言(Web services Definition Language, WSDL)文件中指定的服务的接口。Soap 类是模型的可序列化实现。让我们看看如何确定这些服务的 URL。

通过打开浏览器到以下 URL ,您可以看到部署在 portal 上的服务列表:

http://[host]:[port]/api/axis

Note:在 Liferay 6.2 之前,有两个不同的 url 用于访问远程 Liferay 服务。http://[host]:[port]/api/secure/axis 用于需要验证的服务,http://[host]:[port]/api/axis 用于不需要验证的服务。从 Liferay 6.2 开始,所有远程 Liferay 服务都需要身份验证,使用 http://[host]:[port]/api/axis URL 访问它们。

以下是 UserGroup 的安全 web 服务列表:

  • Portal_UserGroupService (wsdl)
    • addGroupUserGroups
    • addTeamUserGroups
    • addUserGroup
    • deleteUserGroup
    • getUserGroup
    • getUserUserGroups
    • unsetGroupUserGroups
    • unsetTeamUserGroups
    • updateUserGroup

Note: Liferay 的开发人员使用一个名为 Service Builder 的工具,通过 SOAP 自动公开他们的服务。如果您对使用 Service Builder 感兴趣,请参阅本指南中的服务构建器章节。

每个 web service 都列出了其名称、操作和到其 WSDL 文件的链接。WSDL 文件是用 XML 编写的,并提供了描述和定位 web service 的模型。

下面是 UserGroupaddUserGroup 操作的 WSDL 摘录:

<wsdl:operation name="addUserGroup" parametterOrder="name description
publicLayoutSetPropertyId privateLayoutSetPropertyId">
    <wsdl:input message="impl:addUserGroupRequest" name="addUserGroupRequest"/>
    <wsdl:outputMessage="impl:addUserGroupResponse" name="assUserGroupResponse"/>
</wsdl:operation>

要使用该服务,您需要将 WSDL URL 连同登录凭证传递给服务的 SOAP 服务定位器 (service locator)。我们将在下一节中向您展示一个示例。

接下来,让我们调用 web service !


SOAP JAVA CLIENT

可以使用 Eclipse IDE 轻松地设置 Java web service 客户端。方法如下:

在 Eclipse 中,为计划在客户端代码中使用的每个服务向项目添加一个新的 Web Service Client。对于我们的目的,我们正在构建的客户端需要 portal 的 Company、User 和 User Group 服务的 Web Service Client。

添加您的 Web service 客户端在 Eclipse IDE 中,单击 new → other…,然后点开 Web Services 类别。单击 Web Service Client。

对于您创建的每个客户端,都会提示您输入所需服务的服务定义(WSDL)。由于我们的示例 web service 客户端将使用 Liferay Portal 的 Company、User 和 UserGroup 服务,因此我们需要输入以下 WSDL:

http://localhost:8080/api/axis/Portal_CompanyService?wsdl

http://localhost:8080/api/axis/Portal_UserService?wsdl

http://localhost:8080/api/axis/Portal_UserGroupService?wsdl

新建 Web Service Client

当您指定 WSDL 时,Eclipse 将自动添加使用该 web service 所需的辅助文件和库。非常棒!在您使用上面的 WSDL 之一创建了 web 服务客户端项目之后,您需要使用剩余的 WSDL 在项目中创建其他客户端。在一个现有的项目中创建一个额外的客户端,右键单击项目并选择 New → Web Service Client。单击 Next,输入 WSDL,并完成向导。

下面的代码定位并调用操作来创建一个名为 MyUserGroup 的新用户组,并向其添加屏幕显示名称为 test 的用户。在 web service client 项目中创建一个 LiferaySoapClient.java 文件,并向其添加以下代码。如果您在一个包中创建这个类,而不是在下面代码中指定的那个包中,那么就用您的包替换这个包。要从 Eclipse 运行客户端,请确保您的 Liferay 服务器正在运行,请右键单击 LiferaySoapClient.java 类,并选择 _Run as java application_。检查控制台,检查服务调用是否成功。

package com.liferay.test;

import java.net.URL;

import com.liferay.portal.model.CompanySoap;
import com.liferay.portal.model.UserGroupSoap;
import com.liferay.portal.service.http.CompanyServiceSoap;
import com.liferay.portal.service.http.CompanyServiceSoapServiceLocator;
import com.liferay.portal.service.http.UserGroupServiceSoap;
import com.liferay.portal.service.http.UserGroupServiceSoapServiceLocator;
import com.liferay.portal.service.http.UserServiceSoap;
import com.liferay.portal.service.http.UserServiceSoapServiceLocator;

public class LiferaySoapClient {

    public static void main(String[] args) {

        try {
            String remoteUser = "test";
            String password = "test";
            String virtualHost = "localhost";

            String groupName = "MyUserGroup";

            String serviceCompanyName = "Portal_CompanyService";
            String serviceUserName = "Portal_UserService";
            String serviceUserGroupName = "Portal_UserGroupService";

            long userId = 0;

            // Locate the Company
            CompanyServiceSoapServiceLocator locatorCompany =
                new CompanyServiceSoapServiceLocator();

            CompanyServiceSoap soapCompany =
                locatorCompany.getPortal_CompanyService(
                    _getURL(remoteUser, password, serviceCompanyName,
                            true));

            CompanySoap companySoap =
                soapCompany.getCompanyByVirtualHost(virtualHost);

            // Locate the User service
            UserServiceSoapServiceLocator locatorUser =
                new UserServiceSoapServiceLocator();
            UserServiceSoap userSoap = locatorUser.getPortal_UserService(
                _getURL(remoteUser, password, serviceUserName, true));

            // Get the ID of the remote user
            userId = userSoap.getUserIdByScreenName(
                companySoap.getCompanyId(), remoteUser);
            System.out.println("userId for user named " + remoteUser +
                    " is " + userId);

            // Locate the UserGroup service
            UserGroupServiceSoapServiceLocator locator =
                new UserGroupServiceSoapServiceLocator();
            UserGroupServiceSoap usergroupsoap =
                locator.getPortal_UserGroupService(
                    _getURL(remoteUser, password, serviceUserGroupName,
                            true));

            // Get the user's user groups
            UserGroupSoap[] usergroups = usergroupsoap.getUserUserGroups(
                    userId);

            System.out.println("User groups for userId " + userId + " ...");
            for (int i = 0; i < usergroups.length; i++) {
                System.out.println("\t" + usergroups[i].getName());
            }

            // Adds the user group if it does not already exist
            String groupDesc = "My new user group";
            UserGroupSoap newUserGroup = null;

            boolean userGroupAlreadyExists = false;
            try {
                newUserGroup = usergroupsoap.getUserGroup(groupName);
                if (newUserGroup != null) {
                    System.out.println("User with userId " + userId +
                            " is already a member of UserGroup " +
                                    newUserGroup.getName());
                    userGroupAlreadyExists = true;
                }
            } catch (Exception e) {
                // Print cause, but continue
                System.out.println(e.getLocalizedMessage());
            }

            if (!userGroupAlreadyExists) {
                newUserGroup = usergroupsoap.addUserGroup(
                        groupName, groupDesc);
                System.out.println("Added user group named " + groupName);

                long users[] = {userId};
                userSoap.addUserGroupUsers(newUserGroup.getUserGroupId(),
                        users);
            }

            // Get the user's user groups
            usergroups = usergroupsoap.getUserUserGroups(userId);

            System.out.println("User groups for userId " + userId + " ...");
            for (int i = 0; i < usergroups.length; i++) {
                System.out.println("\t" + usergroups[i].getName());
            }
        }
        catch (Exception e) {
            e.getLocalizedMessage();
        }
    }

        private static URL _getURL(String remoteUser, String password,
                        String serviceName, boolean authenticate)
                        throws Exception {

                // Unauthenticated url
                String url = "http://localhost:8080/api/axis/" + serviceName;

                // Authenticated url
                if (authenticate) {
                        url = "http://" + remoteUser + ":" + password
                                        + "@localhost:8080/api/axis/"
                                        + serviceName;
                }

                return new URL(url);
        }

}

运行此客户端应该生成如下示例所示的输出:

userId for user named test is 10196
User groups for user 10196 ...
java.rmi.RemoteException: No UserGroup exists with the key {companyId=10154,
name=MyUserGroup}
Added user group named
Added user to user group named MyUserGroup
User groups for user 10196 ...
    MyUserGroup

控制台的输出告诉我们这个用户没有组,然后将这个用户添加到 UserGroup MyUserGroup

您可能会想,“但是抛出了一个错误!” 我们做错了什么事!“ 是的,抛出了一个错误(java.rmi.RemoteException:),但是我们仍然坐在这里,就像一个冰淇淋三明治一样酷。” 抛出异常仅仅是因为在创建 UserGroup 之前调用了 UserGroup 检查。因为输出的下面几行说 Added user group named...,好了。别担心, 要快乐!

关于这个例子,有几点需要注意:

  • 身份验证是使用 HTTP Basic 身份验证完成的,这对于生产环境是不合适的,因为密码是未加密的。在本例中,它只是为了方便而使用。在生产中,应该设置 company.security.auth.requires.https=false。请参阅 Liferay 的 portal.properties 文件以获取更多信息。
  • 屏幕名称和密码作为凭证在 URL 中传递。
  • 服务的名称(例如,Portal_UserGroupService) 在 URL 的末尾指定。请记住,服务名称可以在 web 服务列表中找到

操作 getCompanyByVirtualHost()getUserIdByScreenName()getUserUserGroups()addUserGroup()addUserGroupUsers() 是为 WSDL 文件中的 -ServiceSOAPCompanyServiceSoapUserServiceSoapUserGroupServiceSoap 指定的。关于每个 Liferay web service 的参数类型、参数顺序、请求类型、响应类型和返回类型的信息可以方便地在 WSDL 中指定。一切都在你的身边!

接下来,让我们用 JavaScript 实现 web service 客户端。

原文使用 PHP 实现 web service 客户端


SOAP JavaScript CLIENT

您可以用支持 Web Service 调用的任何语言编写客户端。让我们调用我们在创建 Java 客户端时所做的相同操作,这次使用 JavaScript 客户端:

请记住,您可以用任何支持使用 SOAP Web Service 的语言实现 web service 客户端。要学习如何实现 OAuth,以便您可以访问第三方服务,请参见授权访问使用 OAuth 教程的服务。


文章作者: CrazyBunQnQ
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明来源 CrazyBunQnQ !
  目录