【发布时间】:2017-02-14 06:30:01
【问题描述】:
我正在尝试使用 Apache HTTPClient 更新 Sharepoint 文档库中的字段,但不断收到 HTTP 错误 400 - Invalid 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.
【问题讨论】:
-
你可以尝试打印url吗
-
@pushpendra URL 打印在控制台日志中。
-
我的服务器相对 URL 是正确的。当我用 get 而不是 post 尝试相同的 url 时,一切正常。所以帖子请求一定有问题,而不是网址
标签: java sharepoint httpclient http-status-code-400