2

谁能给我一个示例,如何使用 xPages Social Enabler 创建新的 IBM Connections 活动?我在文档中找不到任何有用的信息,所以我改编了 Niklas Heidloff 关于如何在 Connections 中创建新书签的示例。我有以下用于创建新活动的代码:

try { 
   var svc = new sbt.ConnectionsService("/activities/service/atom2/activities"); 

   var sb = new java.lang.StringBuilder(); 
   sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); 
   sb.append("<entry xmlns:snx=\"http://www.ibm.com/xmlns/prod/sn\" xmlns:opensearch=\"http://a9.com/-/spec/opensearch/1.1/\" xmlns:thr=\"http://purl.org/syndication/thread/1.0\" xmlns=\"http://www.w3.org/2005/Atom\">"); 
   sb.append("<title type=\"text\">"); 
   sb.append("test activity from xpages"); 
   sb.append("</title>"); 
   sb.append("<content type=\"html\">"); 
   sb.append("</content>"); 
   sb.append("</entry>");                 

   var msg = svc.post(null, sb.toString(), "xml"); 
} catch(e) { 
    print(e) 
} 

但是上面的代码不会创建任何东西,只会在 Domino 控制台上引发错误。这是由 svc.post() 命令返回的:

[31726:00075-3041917840] 11/19/2012 01:03:59 PM  HTTP JVM: Client service request to: http://vhost1279.site1.compute.ihost.com:81/activities/service/atom2/activities did not return OK status. Status returned: 415, reason: Unsupported Media Type, expected:information, please consult error-l 

[31726:00075-3041917840] 11/19/2012 01:03:59 PM  HTTP JVM: g-0.xml located in /local/opt/ibm/lotus/notesdata/domino/workspace/logs 

[31726:00075-3041917840] 11/19/2012 01:03:59 PM  HTTP JVM: com.ibm.xsp.extlib.sbt.services.client.ClientServicesException: HTTP Status 415, Unsupported Media Type. HTTP error response code received in response to request to url: http://vhost1279.site1.comties/service/atom2/activities 

谁能给我一个提示如何正确使用它或指向我一些有用的文档?

4

4 回答 4

1

不要使用 StringBuilder 创建 XML。至少使用SAX或更好的Apache Abdera来创建 XML(Tutorial here)。这确保了您的 XML 是有效的,并且在 Abdera 的情况下也是有效的 ATOM。

使用这种方法很重要Node,因为您会得到一个对象作为回报,它会自动触发所需的内容类型。

然后检查如何在Connections 文档 wiki中创建Activity (是的 - 令人困惑)。在本文中,您可以找到检索活动的代码 - 我实际上建议使用CURL来获取有效格式作为示例。一些 CURL URL 在这里。最接近完整示例的是 Luis 的状态更新演示。

为了探索连接,我使用以下批处理文件:

set server=[server] 
set HOME=c:\work
curl %server%%1 –-netrc -G --basic -k -v -L -o %2 %3 %4 %5 %6 %7

带有 .netrc 文件(参见CURL 文档

 machine [server] login [user] password [password]

这是活动所需的 XML 格式:

<?xml version="1.0" encoding="utf-8"?> 
<entry xmlns="http://www.w3.org/2005/Atom"> 
   <category scheme="http://www.ibm.com/xmlns/prod/sn/type" term="activity" label="Activity"/> 
   <title type="text">Posted activity</title> 
   <content type="html"> 
  This is an activity that has been automatically uploaded from the cURL command line
   </content> 
</entry>

并像这样发布:

post activities/service/atom2/activities newactivity.xml activityresult.xml

打开 activityresult.xml 并找到 app:collection 元素的 href 属性 - 您需要它来添加操作。使用以下 XML:

<?xml version="1.0" encoding="utf-8"?> 
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:snx="http://www.ibm.com/xmlns/prod/sn"> 
   <category scheme="http://www.ibm.com/xmlns/prod/sn/type" term="todo"/> 
   <category term="Connection4.0"/> 
   <category term="Test"/> 
   <title type="text">Some things that need to be done</title> 
   <content type="html"> 
This is an &lt;b&gt;action&lt;/b&gt; in an activity that has been automatically uploaded from the cURL command line.
   </content> 
   <snx:assignedto>noreply@ibm.com</snx:assignedto> 
</entry>

这个命令:

post [the-url-you-found-above] newaction.xml actionresult.xml

一旦 CURL 版本工作,您可以尝试使用 Abdera 代码。

于 2012-11-20T15:38:03.833 回答
0

这是 Firefox 中 REST 客户端的工作示例:

https://vhost1279.site1.compute.ihost.com/activities/service/atom2/activities

标头:Content-Type application/atom+xml

<?xml version="1.0" encoding="UTF-8"?>
<entry xmlns:snx="http://www.ibm.com/xmlns/prod/sn" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns="http://www.w3.org/2005/Atom">
<category scheme="http://www.ibm.com/xmlns/prod/sn/type" term="activity" label="Activity" />
<content type="html"/>
<title type="text">
test
</title>
</entry> 

上面代码的问题是您将字符串传递给 post 方法。然而,这并没有设置正确的内容类型。请使用 Stephan 建议的 API 创建一个带有 XML 的 org.w3c.dom.Node 并将其传入。这将在标题中自动设置正确的内容类型。

于 2012-11-22T14:50:52.483 回答
0

解决了!!!我查看了来源,问题很明显。这是一个错误或至少是误解,但很容易解决。根据文档和我的测试证明,此 Connections 在请求中需要以下标头: Content-Type = application/atom+xml .... 但在 Social Enabler 的源代码中,我发现了这两种相关方法:

protected void prepareRequest(HttpClient httpClient, HttpRequestBase httpRequestBase, Options options) throws ClientServicesException { // TODO: 添加对 gzip 内容的支持 //httpClient.addRequestHeader("Accept-Encoding", "gzip");

        if(options.getHeaders()!=null) {
            addHeaders(httpClient, httpRequestBase, options);
        }
        if (options.content != null) {
            String contentType = null;
            HttpEntity entity = null;
            Object content = options.content;
            try {
                //If a subclass overrides com.ibm.xsp.extlib.services.client.Service.processRequestContent(HttpRequestBase, Object, Options)
                //the the subclass must set the content type of the request, and also set the request's entity!
                if(processRequestContent(httpClient, httpRequestBase, options)){
                    if (content instanceof IValue) {
                        JsonFactory jsFactory = new JsonJavaScriptFactory(DesignerRuntime.getJSContext());
                        entity = new StringEntity(JsonGenerator.toJson(jsFactory, content, true));
                        contentType = "application/json";
                    }
                    else if (content instanceof JsonObject) {
                        JsonFactory jsFactory = JsonJavaFactory.instanceEx;
                        entity = new StringEntity(JsonGenerator.toJson(jsFactory, content, true));
                        contentType = "application/json";
                    }
                    else if (content instanceof Node) {
                        entity = new StringEntity(DOMUtil.getXMLString((Node) content, true));
                        contentType = "application/xml";
                    }
                    else {
                        entity = new StringEntity(content.toString());
                        contentType = findRequestTextContentType(options);
                    }
                }
            } catch (Exception ex) {
                if(ex instanceof ClientServicesException) {
                    throw (ClientServicesException)ex;
                }
                throw new ClientServicesException(ex, "Error while parsing request content");
            }
            if (entity != null && (httpRequestBase instanceof HttpEntityEnclosingRequestBase)) {
                httpRequestBase.setHeader("Content-type", contentType);
                ((HttpEntityEnclosingRequestBase) httpRequestBase).setEntity(entity);
            }
        }
    }

protected String findRequestTextContentType(Options options) {
        return "text/plain";
    }

如您所见,在任何情况下都没有这样的标头(application/atom+xml)。但是,如果您将 XML 内容作为字符串提供,则代码使用“findRequestTextContentType”方法返回默认内容类型,即“文本/纯文本”,这不适合我们的情况。它是硬编码的,因此无法设置默认编码。但是,至少,'findRequestTextContentType' 是类型保护的,因此它可以被覆盖。因此,我创建了自己的 ConnectionsService 类,该类扩展了前一个类并覆盖了 findRequestTextContentType 方法以针对我的案例返回正确的内容类型。这工作正常并解决了问题!

import sbt.ConnectionsService;

public class ConnectionsServiceCustom extends ConnectionsService {

    public ConnectionsServiceTcl(String serviceUrl) {
        super(serviceUrl);
        // TODO Auto-generated constructor stub
    }

     @Override
     protected String findRequestTextContentType(Options options) {
            return "application/atom+xml";
        }

}
于 2012-11-23T09:01:53.467 回答
0

正如 Niklas 和 Stephen 指出的那样,您需要使用 Dom 对象(节点、文档等)。如果您在创建此类对象时遇到错误,则很可能是因为文档/节点的内容格式不正确或不正确.. 有一个内置的 XPages 实用程序类,允许您从字符串创建文档

com.ibm.commons.xml.DOMUtil

查看

com.ibm.commons.xml.DOMUtil.createDocument(String, String)

例如

com.ibm.commons.xml.DOMUtil.createDocument("my xml string", null);

第一个参数是 XML 文档的内容,第二个是格式。

此类提供了几种用于解析和构造 DOM 文档的实用方法。

于 2012-12-05T15:08:49.327 回答