2017-03-10 4 views
-2

Je suis en train d'envoyer une demande à l'interface SharePoint REST. J'essaye de mettre à jour une valeur de colonne. Je suis capable de le faire avec succès lorsque je poste en utilisant Fiddler (Réponse: 204). Quand j'envoie avec Apache HttpClient, je reçois 400 Bad Request - Invalid Verb.400 Bad Request Requête invalide SharePoint Restant Api Java

En note, lorsque j'essaie d'utiliser Fiddler comme proxy (localhost, Port 8888) pour ce programme, la requête se passe avec succès. Mais quand je retire à nouveau le proxy et essaie, il échoue. Est-ce que je fais quelque chose de mal avec mon code Java? Est-ce le moyen d'envoyer une chaîne JSON via HTTP post?

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; 

} 

Répondre

1

Désolé de poster ma propre réponse, mais j'ai finalement trouvé le problème.

L'erreur ExpectContinuedFlag a été activée dans apache HTTPClient.

J'ai changé ce qui suit dans l'initialisation HTTP et maintenant ça marche!

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