7

我需要将 Zimbra Soap API 用于我们正在开发的新功能。但是,我无法找到很多使用此 API 的 Java 客户端示例,而且对于需要研究的内容我总体上有点迷茫。(一般来说,我对使用 SOAP 很陌生)

基本上,我需要发送用户名并为用户获取某种 zimbra ID,使用我的 java 代码修改用户信息,然后将该数据推送回服务器。

我在服务器上找到了这个的 wsdl 文件,但我不确定从这里去哪里。任何帮助将不胜感激 - 从高级解释到示例再到详细步骤。

提前致谢!

4

3 回答 3

5

遗憾的是,Zimbra SOAP API 并不是真正的 SOAP。它基本上是 XML-over-HTTP。因此,您必须手动创建发送到 zimbra 的 xml 文档。

我不知道这方面的 Java 库,我做了一个Python库。

于 2014-10-24T14:57:51.790 回答
1

您可以使用 Zimbra 库来调用 SOAP API:

package com.example.test
import com.zimbra.common.account.ZAttrProvisioning;
import com.zimbra.common.service.ServiceException;
import com.zimbra.common.soap.AdminConstants;
import com.zimbra.common.soap.Element;
import com.zimbra.common.soap.SoapHttpTransport;
import com.zimbra.cs.account.AccountServiceException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;

public class ZimbraApi {
  private static SoapHttpTransport soapHttpTransport = null;
  private String baseUrl = "https://mail.example.com:7071/service/admin/soap/";

  public String getAdminToken(String username, String password) {
    URL url = new URL(baseUrl);
    soapHttpTransport = new SoapHttpTransport(url.toURI().toString());
    soapHttpTransport.setVoidOnExpired(true);
    Element request = Element.XMLElement.mFactory.createElement(AdminConstants.AUTH_REQUEST);
    request.addAttribute(AdminConstants.E_NAME, username);
    request.addAttribute(AdminConstants.E_PASSWORD, password);
    Element response = soapHttpTransport.invoke(request);
    String token = response.getAttribute(AdminConstants.E_AUTH_TOKEN);
    soapHttpTransport.setAuthToken(token);
    return token;
  }

  public void createAccount(String username, String password) {
    Element request = Element.XMLElement.mFactory.createElement(AdminConstants.CREATE_ACCOUNT_REQUEST);
    request.addAttribute(AdminConstants.E_NAME, username);
    request.addAttribute(AdminConstants.E_PASSWORD, password);
    soapHttpTransport.invoke(request);

  }

}
于 2020-10-06T17:12:49.873 回答
0

端点:https://your.domain.for.zimbra/service/soap/GetIdentitiesRequest

信封香皂

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
   <soap:Header>
    <context xmlns="urn:zimbra">
        <format type="xml"/>
        <csrfToken>????????</csrfToken>
    </context>
   </soap:Header>
   <soap:Body>
       <GetIdentitiesRequest xmlns="urn:zimbraAccount">
          <authToken>??????</authToken>
       </GetIdentitiesRequest>
   </soap:Body>
</soap:Envelope>

csrfToken你在 js 中的 window.csrfToken
authToken你在 cooke ZM_AUTH_TOKEN

“soap”的请求必须通过 cookie ZM_AUTH_TOKENJSESSIONIDZM_TEST

使用 Jetty 客户端 API 编写代码

ContentResponse contentResponse = client.POST(endpoint)
                .content(new StringContentProvider("XML envelope"))
                .cookie(new HttpCookie("JSESSIONID", jSessionIdCookieValue))
                .cookie(new HttpCookie("ZM_AUTH_TOKEN", authToken))
                .cookie(new HttpCookie("ZM_TEST", "true"))
                .send();

此外,还有许多端点

https://your.domain.for.zimbra/service/soap/GetInfoRequest 
https://your.domain.for.zimbra/service/soap/GetRightsRequest
https://your.domain.for.zimbra/service/soap/CheckRightsRequest

每个端点的信封仅在子元素中更改

<GetIdentitiesRequest>
<GetInfoRequest>
<GetRightsRequest>
<CheckRightsRequest>
于 2015-10-02T20:52:02.910 回答