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

XML の作成に StringBuilder を使用しないでください。XML の作成には、少なくともSAX以上のApache Abderaを使用してください (チュートリアルはこちら)。これにより、XML が有効であり、Abdera の場合は ATOM も有効であることが保証されます。

Node必要なコンテンツ タイプを自動的にトリガーするオブジェクトを取得するため、このアプローチを使用することが重要です。

次に、 Connections のドキュメント wikiでアクティビティの作成方法を確認してください(はい - 紛らわしいです)。この記事では、アクティビティを取得するためのコードを紹介します。例として、 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

解決しました!!! ソースを調べたところ、問題は明らかでした。これはむしろバグまたは少なくとも誤解ですが、簡単に解決できます。ドキュメントと私のテストによると、この接続にはリクエストで次のヘッダーが必要であることが証明されています。

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」メソッドを使用してデフォルトのコンテンツ タイプを返します。これは、この状況には正しくない「text/plain」です。ハードコーディングされているため、デフォルトのエンコーディングを設定する方法はありません。ただし、少なくとも「findRequestTextContentType」は型保護されているため、オーバーライドできます。そのため、前者を拡張し、findRequestTextContentType メソッドをオーバーライドして、私のケースに適したコンテンツ タイプを返す独自の ConnectionsService クラスを作成しました。そして、これはうまく機能し、問題を解決しました!!

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 オブジェクト (Node、Document など) を使用する必要があります。そのようなオブジェクトを作成するときにエラーが発生する場合は、ドキュメント/ノードの内容が適切にフォーマットされていないか、正しくないことが原因である可能性が最も高いです。 .. 文字列からドキュメントを作成できる XPages util クラスが組み込まれています。

com.ibm.commons.xml.DOMUtil

チェックアウト

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

例えば

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

最初のパラメータは XML ドキュメントの内容で、2 番目のパラメータは形式です。

このクラスは、DOM ドキュメントを解析および構築するためのいくつかのユーティリティ メソッドを提供します。

于 2012-12-05T15:08:49.327 に答える