0

我正在尝试从 Java 中的 Sharepoint 列表中删除文件并遇到一些问题。我正在使用此处描述的批处理元素

我可以提出请求,但返回的结果为 null 并且文件没有被删除(我没有收到任何错误)。

这是我正在使用的 UpdateListItems.Update 的代码:

    UpdateListItems.Updates updates = new UpdateListItems.Updates();
    updates.getContent().add(this.generateXmlNode(      
        "<Batch PreCalc='True' OnError='Continue' ListVersion='1' ListName='" + spMoveRequest.getListName() + "'>" +
            "<Method ID='1' Cmd='Delete'>" +
            "<Field Name='ID'>5</Field>" +//this must be where we   specify the file
            "</Method>" +
        "</Batch>"
    ));  

然后我对 listSoap 对象进行方法调用,如下所示:

    UpdateListItemsResult updateResult = listSoap.updateListItems("<my list name here>", updates);

我还尝试了许多变体,例如使用 GUID 而不是实际列表名称并使用

    <Field Name='FileRef'><my file url here></Field>

来识别文件。

似乎没有任何效果,我也没有得到任何有用的反馈。

我使用的 generateXmlNode 方法如下所示:

        protected Node generateXmlNode(String sXML) throws ParserConfigurationException, SAXException, IOException {

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setValidating(false);
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document documentOptions = builder.parse(new InputSource(new StringReader(sXML)));
    Node elementOptions = documentOptions.getDocumentElement();
    return elementOptions;

}

但是我过去在毫无问题地检索共享点列表时使用过它。

我在这里想念什么?

4

2 回答 2

1

另一种解决方案是使用HTTP DELETE 方法将文件直接删除到具有 NTLMv2 身份验证的 Sharepoint

为此,您可以使用Apache HTTP 客户端

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.2.3</version>
</dependency>

要允许 NTLMv2 身份验证,您需要JCIF库。

<dependency>
   <groupId>jcifs</groupId>
   <artifactId>jcifs</artifactId>
   <version>1.3.17</version>
</dependency>

首先,我们需要编写一个包装器以允许 Apache HTTP 客户端使用 JCIF 来支持 NTLMv2:

public final class JCIFSEngine implements NTLMEngine {

    private static final int TYPE_1_FLAGS =
            NtlmFlags.NTLMSSP_NEGOTIATE_56
            | NtlmFlags.NTLMSSP_NEGOTIATE_128
            | NtlmFlags.NTLMSSP_NEGOTIATE_NTLM2
            | NtlmFlags.NTLMSSP_NEGOTIATE_ALWAYS_SIGN
            | NtlmFlags.NTLMSSP_REQUEST_TARGET;

    @Override
    public String generateType1Msg(final String domain, final String workstation)
            throws NTLMEngineException {
        final Type1Message type1Message = new Type1Message(TYPE_1_FLAGS, domain, workstation);
        return Base64.encode(type1Message.toByteArray());
    }

    @Override
    public String generateType3Msg(final String username, final String password,
            final String domain, final String workstation, final String challenge)
            throws NTLMEngineException {
        Type2Message type2Message;
        try {
            type2Message = new Type2Message(Base64.decode(challenge));
        } catch (final IOException exception) {
            throw new NTLMEngineException("Invalid NTLM type 2 message", exception);
        }
        final int type2Flags = type2Message.getFlags();
        final int type3Flags = type2Flags
                & (0xffffffff ^ (NtlmFlags.NTLMSSP_TARGET_TYPE_DOMAIN | NtlmFlags.NTLMSSP_TARGET_TYPE_SERVER));
        final Type3Message type3Message = new Type3Message(type2Message, password, domain,
                username, workstation, type3Flags);
        return Base64.encode(type3Message.toByteArray());
    }
}

参考

使用身份验证执行 HTTP DELETE 的主要代码:

    try {

        HttpParams params = new BasicHttpParams();
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
        DefaultHttpClient httpclient = new DefaultHttpClient(params);

        //Register JCIF NTLMv2 to manage ntlm auth.
        httpclient.getAuthSchemes().register("ntlm", new AuthSchemeFactory() {
            @Override
            public AuthScheme newInstance(HttpParams hp) {
                return new NTLMScheme(new JCIFSEngine());
            }
        });

        //Provide login/password
        httpclient.getCredentialsProvider().setCredentials(
                AuthScope.ANY,
                new NTCredentials([LOGIN], [PASSWORD], "", [DOMAIN]));
        //Create HTTP PUT Request   

        HttpPut request = new HttpDelete("http://[server]/[site]/[folder]/[fileName]");         
        return httpclient.execute(request);

    } catch (IOException ex) {
      //...
    }

将文件上传到 Sharepoint 的链接问题:如何使用 Java 将文档上传到 SharePoint?

于 2013-04-25T14:24:40.290 回答
0

您可以查看我开发的这个项目,以提供一个可以以非常简单的方式使用的工作共享点休息 api 客户端。看看这里的github:

https://github.com/kikovalle/PLGSharepointRestAPI-java

于 2020-07-12T12:11:39.243 回答