简体   繁体   中英

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

I am trying to update a field inside a Sharepoint document library using Apache HTTPClient, but keep getting HTTP error 400 - Invalid URL. The code and the output is as mentioned below. Please advise why this is happening

文档库图像

    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;

}

Console Logs:

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.

I realized my mistake so I am posting an answer. The HttpClient was sending an expect header field in the request, which it shouldn't be sending. Also the X-Request-Digest had to be replaced by X-RequestDigest .

The way to turn off the expect header was as follows:

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();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM