簡體   English   中英

獲取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頭字段,它不應該發送。 此外, X-Request-Digest必須由X-RequestDigest替換。

關閉expect標頭的方法如下:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM