Send data using SharePoint API using Java http client

I am trying to publish a SharePoint list item to a SharePoint 2010 list using a Java client. I can read the SP list items using the code below, but I am not sure how to write in SharePoint. For post operation I am getting http 401 error. Any guidance would be greatly appreciated.

GET operation:

String url = "https://organization.company.com/sites/Ateam/_vti_bin/ListData.svc/TableLoadInfo";        DefaultHttpClient client = new DefaultHttpClient();

        NTCredentials credentials = new NTCredentials(username, password, hostname, domain);
        AuthScope scope = new AuthScope(hostname, 443);

        SSLContext sslcontext = SSLContext.getInstance("TLS");
        sslcontext.init(null, new TrustManager[] { trustmanager }, null);

        SSLSocketFactory sf = new SSLSocketFactory(sslcontext,              SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
        Scheme https = new Scheme("https", 443, sf);

        client.getConnectionManager().getSchemeRegistry().register(https);
        client.getCredentialsProvider().setCredentials(scope, credentials);

        HttpGet request = new HttpGet(url);
        //request.addHeader("Accept", "application/xml");
        request.addHeader("Accept", "application/json;odata=verbose");

        HttpResponse response = client.execute(request);

      

POST operation:

String url = " https://organization.company.com/sites/Ateam/_vti_bin/ListData.svc/TableLoadInfo ";

Client DefaultHttpClient = new DefaultHttpClient ();

        NTCredentials credentials = new NTCredentials(username, password, hostname, domain);
        AuthScope scope = new AuthScope(hostname, 443);

        SSLContext sslcontext = SSLContext.getInstance("TLS");
        sslcontext.init(null, new TrustManager[] { trustmanager }, null);

        SSLSocketFactory sf = new SSLSocketFactory(sslcontext, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
        Scheme https = new Scheme("https", 443, sf);

        client.getConnectionManager().getSchemeRegistry().register(https);
        client.getCredentialsProvider().setCredentials(scope, credentials);

        // POST a data
        HttpPost request = new HttpPost(url);

                    request.addHeader("Accept", "application/json;odata=verbose");
        request.addHeader("Content-type", "application/json;odata=verbose");
        // request.addHeader("X-RequestDigest", FormDigestValue);
        request.addHeader("X-HTTP-Method", "POST");
        request.addHeader("If-Match", "*");

        JSONStringer json = (JSONStringer) new JSONStringer().object().key("Table_Name").value("TableName 1")
                .key("Load_Frequency").value("Weekly").key("Cycle").value("CURRENT").endObject();


        StringEntity se = new StringEntity(json.toString());
        request.setEntity(se);

                    HttpResponse response = client.execute(request);

      

+3


source to share


1 answer


When you submit data to SharePoint, you must add "FormDigestValue" inside the header.

Note that you have commented out the " request.addHeader("X-RequestDigest", FormDigestValue);

" line .

This is why you are getting 401 error.

First you need to get the "FormDigestValue" on your current site. Then add this value inside the header. The following code shows a way to get FormDigestValue.



            String digestqueryURL = serverurl + subsite + "/" + "_api/contextinfo";
            HttpPost httpPost = new HttpPost(digestquery);
            httpPost.addHeader("Accept", "application/json;odata=verbose");
            httpPost.addHeader("X-ClientService-ClientTag", "SDK-JAVA");
            HttpResponse response = httpClient.execute(httpPost);

            byte[] content = EntityUtils.toByteArray(response.getEntity());

            String jsonString = new String(content, "UTF-8");
            JSONObject json = new JSONObject(jsonString);

            String FormDigestValue = json.getJSONObject("d")
                    .getJSONObject("GetContextWebInformation")
                    .getString("FormDigestValue");

      

Then add FormDigestValue to the header when doing post operations.

request.addHeader("X-RequestDigest", FormDigestValue);

      

0


source







All Articles