2017-03-10 7 views
-2

SharePoint RESTインターフェイスへの要求を投稿しようとしています。私は列の値を更新しようとしています。私はFiddler(Response:204)を使用して投稿すると、これを正常に実行できます。 Apache HttpClientを使用して送信すると、400 Bad Request - Invalid Verbが返されます。400不正な要求が無効な動詞SharePoint Rest API Java

副作用として、このプログラムのプロキシ(localhost、ポート8888)としてFiddlerを使用しようとすると、要求は正常に実行されます。しかし、私が再びプロキシを削除して試してみると成功しません。 Javaコードに何か問題がありますか?

これは、HTTPポストを介してJSON文字列を送信する方法ですか?

private static final String API_ENDPOINT = "/_api/web"; 
    private static final String CONTEXT_INFO_ENDPOINT = "/_api/contextinfo"; 
    private static final String APPLICATION_JSON = "application/json;odata=verbose"; 
    private static final String IF_MATCH = "If-Match"; 
    private static final String X_HTTP_Method = "X-HTTP-Method"; 
    private static final String MERGE = "MERGE"; 
    private static final String X_RequestDigest = "X-RequestDigest"; 
    private static final String METADATA = "__metadata"; 

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

    CloseableHttpResponse response = null; 

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

     postRequest.addHeader(HttpHeaders.ACCEPT, APPLICATION_JSON); 
     postRequest.addHeader(HttpHeaders.CONTENT_TYPE, APPLICATION_JSON); 
     postRequest.addHeader(HttpHeaders.HOST, siteURI.getHost()); 
     postRequest.addHeader(IF_MATCH, "*"); 
     postRequest.addHeader(X_HTTP_Method, MERGE); 

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

     JSONObject type = new JSONObject(); 
     type.put("type", fieldType); 

     JSONObject jsonBody = new JSONObject(); 
     jsonBody.put(METADATA , type); 
     jsonBody.put(fieldName, fieldValue); 


     logger.debug("setFieldValue(): " + jsonBody.toString()); 
     postRequest.setEntity(new StringEntity(jsonBody.toString())); 
     //String jsonString = "{'__metadata':{'type':'SP.Data.NextlabsDLItem'},'TextHeader':'Java1'}"; 
     //JSONObject jsonObject = new JSONObject(jsonString); 
     //logger.debug(jsonObject); 
     //postRequest.setEntity(new ByteArrayEntity(jsonBody.toString().getBytes(), ContentType.APPLICATION_JSON)); 
     logger.debug("setFieldValue(): " + postRequest.getRequestLine()); 

     response = httpClient.execute(postRequest); 

     logger.debug("setFieldValue(): " + response.getStatusLine()); 

     int status = response.getStatusLine().getStatusCode(); 

     HttpEntity entity = response.getEntity(); 
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent())); 
     int cp; 
     StringBuilder sb = new StringBuilder(); 
     while ((cp = bufferedReader.read()) != -1) { 
      sb.append((char) cp); 
     } 
     logger.debug("String Response......." + sb); 
     bufferedReader.close(); 
     if (status >= 200 && status < 300) { 
      return true; 
     } else { 
      logger.error("setFieldValue(): " + response.getStatusLine().toString().toUpperCase()); 
     } 

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

} 

答えて

1

申し訳ありませんが、自分の回答を投稿しましたが、最終的に問題が見つかりました。

間違えたのはExpectContinuedFlagで、Apache HTTPClientで有効になっています。

HTTP初期化で次のように変更されました。

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

    return HttpClients.custom() 
      .setConnectionManager(connManager) 
      .setDefaultCredentialsProvider(creds) 
      .setDefaultRequestConfig(requestConfig) 
      .build(); 
関連する問題