0

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

Document Library Image

    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

When I try the same URL with a GET request everything works fine, meaning something wrong with the post request.

0

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.