Atlassian Confluence:如何使用REST API更新页面

5
我将尝试使用以下代码更新Confluence页面: https://bitbucket.org/jaysee00/confluence-rest-api-example/src/master/src/main/java/com/atlassian/api/examples/Main.java 代码如下:
public class Confluence {
/**
 * Demonstrates how to update a page using the Conflunence 5.5 REST API.
 */
private static final Logger LOGGER = Logger.getLogger(Confluence.class);;
private static final String BASE_URL = "http://confluence:8080";
private static final String USERNAME = "admin";
private static final String PASSWORD = "admin";
private static final String ENCODING = "utf-8";

private String getContentRestUrl(Long contentId, String[] expansions)
        throws UnsupportedEncodingException {
    String expand = URLEncoder.encode(StringUtils.join(expansions, ","),
            ENCODING);

    return String
            .format("%s/rest/api/content/%s?expand=%s&os_authType=basic&os_username=%s&os_password=%s",
                    BASE_URL, contentId, expand,
                    URLEncoder.encode(USERNAME, ENCODING),
                    URLEncoder.encode(PASSWORD, ENCODING));
}

public void publish() throws ClientProtocolException, IOException,   Exception {
    final long pageId = 36307446;

    HttpClient client = new DefaultHttpClient();

    // Get current page version
    String pageObj = null;
    HttpEntity pageEntity = null;
    try {
        String restUrl = getContentRestUrl(pageId,
                new String[] { "body.storage", "version", "ancestors" });
        HttpGet getPageRequest = new HttpGet(restUrl);
        HttpResponse getPageResponse = client.execute(getPageRequest);
        pageEntity = getPageResponse.getEntity();

        pageObj = IOUtils.toString(pageEntity.getContent());

        LOGGER.info("Get Page Request returned "
                + getPageResponse.getStatusLine().toString());
        LOGGER.info(pageObj);
        LOGGER.info((int)pageObj.trim().charAt(0));
    } finally {
        if (pageEntity != null) {
            EntityUtils.consume(pageEntity);
        }
    }

    // Parse response into JSON
    JSONObject page = new JSONObject(pageObj.trim());

    // Update page
    // The updated value must be Confluence Storage Format
    // NOT HTML.
    page.getJSONObject("body").getJSONObject("storage")
            .put("value", "hello, world");

    int currentVersion = page.getJSONObject("version").getInt("number");
    page.getJSONObject("version").put("number", currentVersion + 1);

    // Send update request
    HttpEntity putPageEntity = null;

    try {
        HttpPut putPageRequest = new HttpPut(getContentRestUrl(pageId,
                new String[] {}));

        StringEntity entity = new StringEntity(page.toString());
        entity.setContentType("application/json");
        putPageRequest.setEntity(entity);

        HttpResponse putPageResponse = client.execute(putPageRequest);
        putPageEntity = putPageResponse.getEntity();

        System.out.println("Put Page Request returned "
                + putPageResponse.getStatusLine().toString());
        System.out.println("");
        System.out.println(IOUtils.toString(putPageEntity.getContent()));
    } finally {
        EntityUtils.consume(putPageEntity);
    }
}

响应始终为“HTTP 404 - 页面未找到”。我已将页面ID更改为我知道在Confluence中存在的页面。

当尝试将响应解析为JSON对象时,会出现异常:

avvvaorg.json.JSONException: A JSONObject text must begin with '{' at character 1
at org.json.JSONTokener.syntaxError(JSONTokener.java:496)
at org.json.JSONObject.<init>(JSONObject.java:180)
at org.json.JSONObject.<init>(JSONObject.java:403)
at com.openet.report.publish.Confluence.publish(Confluence.java:74)
at com.openet.report.miner.ReportMiner.generateSummary(ReportMiner.java:268)
at com.openet.report.miner.ReportMiner.runReport(ReportMiner.java:251)
at com.openet.report.miner.ReportMiner.main(ReportMiner.java:138)

请提供一些代码 - m02ph3u5
可能是由于Confluence的版本问题 - 我尝试使用confluence.atlassian.com进行简单的JMeter REST请求,它可以正常工作,但是在我使用的版本4.3.1中无法工作。 - eeijlar
1个回答

0
使用 REST 来更新 Confluence 4.3.1 版本的页面是不被支持的。该 API 的功能受到了很大限制: https://docs.atlassian.com/atlassian-confluence/REST/4.3.1/ 不过,您仍然可以使用 XML RPC 来更新 Confluence。
public void publish() throws IOException {
    DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
    Date today = Calendar.getInstance().getTime(); 
    XWikiXmlRpcClient rpc = new XWikiXmlRpcClient(CONFLUENCE_URI);
    try {
        rpc.login(USER_NAME, PASSWORD);
        //The info macro would get rendered an info box in the Page
        Page page = new Page();
        page.setSpace("Some space");
        page.setTitle("Testing XML RPC calls in confluence_" + df.format(today));            
        //page.setContent(
        String s = String.format("||Heading 1||Heading 2||Heading 3||%s|col A1|col A2|col A3|", "\r\n");
        page.setContent(s);
        page.setParentId(PAGEID);            
        rpc.storePage(page);
        } catch (XmlRpcException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

            // TODO Auto-generated catch block

}

这需要以下的库:

import org.apache.xmlrpc.XmlRpcException;
import org.codehaus.swizzle.confluence.Page;
import org.w3c.dom.Document;
import org.xwiki.xmlrpc.XWikiXmlRpcClient;

请注意,这些库不在标准的Maven仓库中。您需要更新您的仓库管理器(例如我的Artifactory)以与XWiki Maven仓库同步。您还需要正确配置Confluence上的Service Rocket插件(https://community.servicerocket.com/servicerocket/topics/the-license-could-not-be-verified-there-is-no-license-certificate-installed-for-customware-scaffolding-plugin-for-confluence)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接