获取 HTTP 错误 400 错误请求 - 尝试更新 SharePoint 字段时无效 URL

Getting HTTP error 400 Bad Request - Invalid URL when trying to update SharePoint field

我正在尝试使用 Apache HTTPClient 更新 Sharepoint 文档库中的字段,但不断收到 HTTP 错误 400 - 无效 URL。代码和输出如下所述。请告知为什么会这样

    public static boolean setFieldValue(CloseableHttpClient httpClient, String siteURL, String serverRelativeURL, String fieldName, String fieldValue) {

    CloseableHttpResponse httpResponse = null;

    try {
        URI siteURI = new URI(siteURL);
        URI postURI = new URIBuilder(siteURI)
                .setPath(siteURI.getPath() + "/_api/web/GetFileByServerRelativeUrl('" + serverRelativeURL + "')/ListItemAllFields")
                .build();
        HttpPost httpPost = new HttpPost(postURI);

        String formDigestValue = getFormDigestValue(httpClient, postURI);
        if (StringUtils.isBlank(formDigestValue)) {
            logger.error("FORM DIGEST VALUE IS = " + formDigestValue);
            return false;
        }

        httpPost.addHeader(ACCEPT, APPLICATION_JSON);
        httpPost.addHeader(CONTENT_TYPE, APPLICATION_JSON);
        httpPost.addHeader(X_HTTP_Method, MERGE);
        httpPost.addHeader(IF_MATCH, Punctuation.ASTERISK);
        httpPost.addHeader(X_REQUEST_DIGEST, formDigestValue);

        JSONObject jsonObject = new JSONObject();
        jsonObject.put(fieldName, fieldValue);
        jsonObject.put("__metadata", new JSONObject().put("type", "SP.Data.PuneetsLibraryItem"));
        logger.debug(jsonObject);

        httpPost.setEntity(new StringEntity(jsonObject.toString()));

        logger.trace(httpPost.getRequestLine());
        logger.trace(httpPost.getURI());

        httpResponse = httpClient.execute(httpPost);

        HttpEntity entity = httpResponse.getEntity();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent()));
        if (bufferedReader != null) {
            int cp;
            StringBuilder sb = new StringBuilder();
            while ((cp = bufferedReader.read()) != -1) {
                sb.append((char) cp);
            }
            logger.debug("String Response......." + sb);
            bufferedReader.close();
        }
        logger.debug("Response......." + entity.getContent());

        logger.trace(httpResponse.getStatusLine().getReasonPhrase());

        int status = httpResponse.getStatusLine().getStatusCode();
        if (status >= 200 && status < 300) {
            return true;
        } else {
            logger.error("ERROR: " + httpResponse.getStatusLine().toString().toUpperCase());
        }

    } catch (URISyntaxException | IOException e) {
        logger.error(e.getMessage(), e);
    } finally {
        try {
            if (httpResponse != null) {
                httpResponse.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return false;

}

控制台日志:

13:57:44.089 [main] DEBUG com.nextlabs.smartclassifier.sharepoint.SharePointUtil - POST http://sp2013w2k12r2/_api/contextinfo HTTP/1.1
13:57:45.417 [main] TRACE com.nextlabs.smartclassifier.sharepoint.SharePointUtil - HTTP/1.1 200 OK
13:57:45.417 [main] DEBUG com.nextlabs.smartclassifier.sharepoint.SharePointUtil - {"TestField":"Puneet","__metadata":{"type":"SP.Data.PuneetsLibraryItem"}}
13:57:45.433 [main] TRACE com.nextlabs.smartclassifier.sharepoint.SharePointUtil - POST http://sp2013w2k12r2/_api/web/GetFileByServerRelativeUrl('/PuneetsLibrary/Three.docx')/ListItemAllFields HTTP/1.1
13:57:45.433 [main] TRACE com.nextlabs.smartclassifier.sharepoint.SharePointUtil - http://sp2013w2k12r2/_api/web/GetFileByServerRelativeUrl('/PuneetsLibrary/Three.docx')/ListItemAllFields
13:57:45.448 [main] DEBUG com.nextlabs.smartclassifier.sharepoint.SharePointUtil - String Response.......<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Invalid URL</h2>
<hr><p>HTTP Error 400. The request URL is invalid.</p>
</BODY></HTML>

13:57:45.448 [main] DEBUG com.nextlabs.smartclassifier.sharepoint.SharePointUtil - Response.......org.apache.http.conn.EofSensorInputStream@199bd995
13:57:45.448 [main] TRACE com.nextlabs.smartclassifier.sharepoint.SharePointUtil - Bad Request
13:57:45.448 [main] ERROR com.nextlabs.smartclassifier.sharepoint.SharePointUtil - ERROR: HTTP/1.1 400 BAD REQUEST
13:57:45.448 [main] INFO  com.nextlabs.smartclassifier.util.HTTPClientUtil - Trying to close HTTP Connections
13:57:45.448 [main] INFO  com.nextlabs.smartclassifier.util.HTTPClientUtil - HTTP Connections closed successfully.

我意识到我的错误,所以我发布了一个答案。 HttpClient 在请求中发送了一个 expect header 字段,它不应该发送。 X-Request-Digest 也必须替换为 X-RequestDigest

关闭expect header的方法如下:

defaultRequestConfig = RequestConfig.custom()
        .setExpectContinueEnabled(false)
        .setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM, AuthSchemes.DIGEST))
        .setProxyPreferredAuthSchemes(Collections.singletonList(AuthSchemes.BASIC))
        .build();

httpclient = HttpClients.custom()
        .setConnectionManager(httpClientConnectionManager)
        .setDefaultCredentialsProvider(credentialsProvider)
        .setDefaultRequestConfig(defaultRequestConfig)
        //.setConnectionTimeToLive(1, TimeUnit.MINUTES)
        .build();