Java连接Dynamics 365 CRM并请求数据,通过Oauth2.0认证

import com.microsoft.aad.adal4j.AuthenticationResult;
import com.microsoft.aad.adal4j.AuthenticationContext;
import io.vertx.core.json.JsonObject;
import netscape.javascript.JSObject;


import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.apache.olingo.client.api.ODataClient;
import org.apache.olingo.client.api.ODataClientBuilder;
import org.apache.olingo.client.api.domain.ClientEntity;
import org.apache.olingo.client.api.domain.ClientEntitySet;
import org.apache.olingo.client.api.domain.ClientProperty;
import org.apache.olingo.client.core.ODataClientFactory;
import org.apache.olingo.client.core.http.HttpPatch;
import org.apache.olingo.commons.api.format.ContentType;
import org.springframework.security.oauth2.client.DefaultOAuth2ClientContext;
import org.springframework.security.oauth2.client.OAuth2ClientContext;
import org.springframework.security.oauth2.client.OAuth2RestTemplate;
import org.springframework.security.oauth2.client.token.AccessTokenRequest;
import org.springframework.security.oauth2.client.token.DefaultAccessTokenRequest;
import org.springframework.security.oauth2.client.token.grant.password.ResourceOwnerPasswordResourceDetails;
import org.springframework.security.oauth2.common.OAuth2AccessToken;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;
import java.util.zip.GZIPInputStream;


public class demo {

    private HttpURLConnection urlConnection =null;
    public  demo()
    {

    }
    public static void main(String[] args) throws Exception {
        System.out.println("Hello World!");

        String _token = GetDynamics365Token();// getToken().getAccessToken().toString();

        System.out.println(_token);

         //String ret = GetAccount(_token);
        // testcreateContact(_token);
        // testGetContact(_token);
         testupdateContact(_token);
    }
    private  static  void testupdateContact(String _token)
    {
        String api = APIUrl+"procontacts"+"(1948d283-a404-ec11-b6e6-000d3aa2e3d2)";


        JsonObject json = new JsonObject();
        json.put("name","tested by JAVA API(Data patch)");
        json.put("phone","18824158458_patch");
        json.put("email","7874108@qq.com_patch");
        json.put("fullname","fullname test of java call api");
        json.put("contactid@odata.bind","/contacts(40a42e1b-9900-ec11-94ef-00224858241d)");



        //String b = HttpUtil.doPostToJson(api,json.toString(),_token,"Patch");
        String b = HttpPatch(api,_token,json);
        if(String.valueOf(b).contains("No-Content"))
        {
            System.out.println("Updated.");
        }

    }
    /**
     * patch请求
     *author:fantabulous24
     * @date 2020年7月9日 下午3:24:50
     */
    public static String HttpPatch(String url,String _token,JsonObject json) {
       String  resultObj = null;

        HttpClient httpClient = new DefaultHttpClient();
        HttpPatch httpPatch = new HttpPatch(url);
        httpPatch.setHeader("Content-type", "application/json");
        httpPatch.setHeader("Charset", HTTP.UTF_8);
        httpPatch.setHeader("Accept", "application/json");
        httpPatch.setHeader("Accept-Charset", HTTP.UTF_8);
        httpPatch.setHeader("Authorization","Bearer "+_token);
        try {
            StringEntity entity=null;
            if(json !=null)
            {
               entity = new StringEntity(json.toString(),StandardCharsets.UTF_8);
            }
            else
            {
                return  "";
            }

            httpPatch.setEntity(entity);
            HttpResponse response = httpClient.execute(httpPatch);

            resultObj = response.toString();

        } catch (IOException e) {
            e.printStackTrace();
        }
        return resultObj;
    }

    private  static void testcreateContact(String _token) throws Exception {

        String api = APIUrl+"procontacts";
        JsonObject json = new JsonObject();
        json.put("name","tested by JAVA API");
        json.put("phone","18824158458");
        json.put("email","7874108@qq.com");


       String a =  HttpUtil.doPostToJson(api,json.toString(),_token,"POST");

       if(a=="")
       {
           System.out.println("Created!");
       }

    }

    private  static void testGetContact(String token) throws Exception {
        String ret = null;

        String queryurl = APIUrl + "procontacts?$select=procontactid,email,phone,name,createdon&$top=3";

        ret = HttpUtil.doPostToJson(queryurl,null,token,"GET");

        System.out.println(ret);

    }

        private  static String GetAccount(String token) throws Exception {
        String ret =null;
        HttpURLConnection connection =null;
        String queryurl = APIUrl+ "accounts?$select=accountid,accountnumber,createdon,telephone1&$top=3";
        URL url = new URL(queryurl);

        connection = buildConnection(url,token,"GET");

        int res = connection.getResponseCode();

        if(res==200)
        {

            ClientEntitySet odataEntitySet = GetConnectionResult(connection);

            for (ClientEntity odataEntity: odataEntitySet.getEntities())
            {
                for (ClientProperty curProperty: odataEntity.getProperties())
                {
                    String propertyContent = curProperty.getName()+":"+curProperty.getValue().toString();
                    ret += propertyContent +"\n";
                    System.out.println(propertyContent);
                }
            }
        }

        return ret;
    }

    private static ClientEntitySet GetConnectionResult(HttpURLConnection conn) throws Exception {

        ODataClient client = ODataClientFactory.getClient();

        String jsonObject =null;
        if("gzip".equals(conn.getContentEncoding()))
        {
            Reader reader = new InputStreamReader(new GZIPInputStream(conn.getInputStream()));

            String jsonRawOutput ="";
            while (true)
            {
                int ch = reader.read();

                if(ch==1)
                {
                    break;
                }
                jsonRawOutput += (char)ch;
            }
            jsonObject = jsonRawOutput;
        }
        else
        {
            BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String jsonoutput ="";
            while (true)
            {
                int ch = in.read();
                if(ch==-1)
                {
                    break;
                }
                jsonoutput += (char)ch;
            }
            jsonObject = jsonoutput;
        }

        InputStream inputStream = new ByteArrayInputStream(jsonObject.getBytes(StandardCharsets.UTF_8));

        return client.getReader().readEntitySet(inputStream, ContentType.APPLICATION_JSON);
    }

    private  static HttpURLConnection buildConnection( URL _url,String _token,String _RequestMethod ) throws Exception {

        if(_RequestMethod.trim()=="")
        {
            return  null;
        }
        HttpURLConnection _connect = (HttpURLConnection) _url.openConnection();
        _connect.setRequestMethod(_RequestMethod);

        _connect.setRequestProperty("OData-MaxVersion","4.0");
        _connect.setRequestProperty("OData-Version","4.0");
        _connect.setRequestProperty("Accept","application/json");
        _connect.setRequestProperty("Content-Type","application/json");
        _connect.setRequestProperty("Prefer","odata.include-annotations=OData.Community.Display.V1.FormattedValue");
       // _connect.setRequestProperty("Prefer","odata.include-annotations=\\\"Microsoft.Dynamics.CRM.fetchxmlpagingcookie\\");
        _connect.setRequestProperty("Authorization","Bearer "+_token);
        _connect.connect();

        return  _connect;

    }

    private static String tokenUrl = "https://login.microsoftonline.com/common/oauth2/token";
    private static String resource = "https://url.crm5.dynamics.com";
    private static String clientId ="xxxxxxx-e055-4f71-b3c0-xxxxxxxf3";
    private static String username = "youraccount of CLOUD.onmicrosoft.com";
    private static String password = "pwd";
    private static String APIUrl = "https://youraddress.crm5.dynamics.com/api/data/v9.0/";

    private  static  AuthenticationResult getToken() {
        AuthenticationResult token = null;
        AuthenticationContext context = null;
        ExecutorService service = null;
        try
        {
           service = Executors.newFixedThreadPool(1);
           context = new AuthenticationContext(tokenUrl,false,service);
            Future<AuthenticationResult> async = context.acquireToken(resource,clientId,username,password,null);
           token = async.get();

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        finally {
            service.shutdown();
        }
        return token;
    }

    private static String GetDynamics365Token() throws Exception    {
        String token ="";
        String tokenUrl = "https://login.microsoftonline.com/common/oauth2/token";
        String resource = "https://youaddress.crm5.dynamics.com";
        String clientId ="a0717f72-235-4f71-xxxxx-9cxxxxxx7af3";
        String username = "yourcLOUD.onmicrosoft.com";
        String password = "your password";
        ResourceOwnerPasswordResourceDetails resourceDetails = new ResourceOwnerPasswordResourceDetails();

        resourceDetails.setAccessTokenUri(tokenUrl);
        resourceDetails.setId(clientId);
        Map<String, List<String>> HeadersMap = new HashMap<String,List<String>>();
        HeadersMap.put("Cache-Control", Arrays.asList("no-cache"));
        HeadersMap.put("Content-Type",Arrays.asList("application/x-www-form-urlencoded"));

        AccessTokenRequest atr = new DefaultAccessTokenRequest();
        resourceDetails.setGrantType("password");

        atr.add("Bearer Token","Access_Token");
        atr.add("Client_Id",clientId);
        atr.add("Version","v9.0");
        atr.add("resource",resource);
        atr.add("username",username);
        atr.add("password",password);

        OAuth2ClientContext context = new DefaultOAuth2ClientContext(atr);
        OAuth2RestTemplate template = new OAuth2RestTemplate(resourceDetails,context);

        OAuth2AccessToken _token = template.getAccessToken();

        token = _token.toString();

        return token;
    }
}
/*
另一个封装好的Get, Post类
*/
import io.vertx.core.json.JsonObject;
import org.apache.http.impl.client.DefaultHttpClient;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.http.HttpClient;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Map;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class HttpUtil
{
    public static String doPostToJson(String urlPath, String Json,String _token,String HttpMethod) {

        String result = "";
        BufferedReader reader = null;
        HttpURLConnection conn = null;
        try {
            trustAllHosts();
            URL url = new URL(urlPath);
            if (url.getProtocol().toLowerCase().equals("https")) {
                HttpsURLConnection httpsConn = (HttpsURLConnection) url.openConnection();
                httpsConn.setHostnameVerifier(DO_NOT_VERIFY);
                conn = httpsConn;
            }
            else {
                conn = (HttpURLConnection) url.openConnection();
            }

            if(HttpMethod !=null)
            {
                conn.setRequestMethod(HttpMethod);
            }
            else {
                conn.setRequestMethod("POST");
            }
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setUseCaches(false);
            conn.setRequestProperty("Connection", "Keep-Alive");
            conn.setRequestProperty("Charset", "UTF-8");
            conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
            // conn.setRequestProperty("accept","*/*");
            conn.setRequestProperty("accept", "application/json");
            conn.setRequestProperty("Authorization","Bearer "+_token);
            if (Json != null) {
                byte[] writebytes = Json.getBytes();
                conn.setRequestProperty("Content-Length", String.valueOf(writebytes.length));
                OutputStream outwritestream = conn.getOutputStream();
                outwritestream.write(Json.getBytes());
                outwritestream.flush();
                outwritestream.close();
            }

            if (conn.getResponseCode() == 200) {
                reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
                result = reader.readLine();
            }
            else if(conn.getResponseCode() == 204)
            {
                reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
                result = reader.readLine();
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            if (reader != null) {
                try {
                    reader.close();
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return result;
    }

    final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier()
    {
        public boolean verify(String arg0, SSLSession arg1) {
            return true;
        }
    };

    public static void trustAllHosts() {
        TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager()
        {

            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[] {};
            }

            public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {

            }

            public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {

            }
        }

        };

        try {
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, trustAllCerts, new SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        }
        catch (Exception e) {
            e.printStackTrace();
        }

    }


}

在工程的POM.XML中需引入下列依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>CRM_DEMO</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>Jar_last</module>
    </modules>

    <properties>
        <maven.compiler.source>16</maven.compiler.source>
        <maven.compiler.target>16</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>commons-httpclient</groupId>
            <artifactId>commons-httpclient</artifactId>
            <version>3.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security.oauth</groupId>
            <artifactId>spring-security-oauth2</artifactId>
            <version>2.3.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>io.vertx</groupId>
            <artifactId>vertx-core</artifactId>
            <version>4.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.olingo</groupId>
            <artifactId>odata-client-api</artifactId>
            <version>4.5.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.olingo</groupId>
            <artifactId>odata-client-core</artifactId>
            <version>4.5.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.olingo</groupId>
            <artifactId>odata-commons-core</artifactId>
            <version>4.5.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.olingo</groupId>
            <artifactId>odata-commons-api</artifactId>
            <version>4.5.0</version>
        </dependency>
        <dependency>
            <groupId>org.mortbay.jetty</groupId>
            <artifactId>jetty-util</artifactId>
            <version>6.1.25</version>
        </dependency>


    </dependencies>
</project>

测试结果如下,能正常输出
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fei-AX&CRM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值