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.HttpDelete;
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.*;
import java.nio.charset.Charset;
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);
testSelectContact(_token);
//testGetContact(_token);
testPostContact(_token);
// testcreateContact(_token);
// testupdateContact(_token);
//testDeleteContact(_token);
}
private static void testPostContact(String _token) throws URISyntaxException {
HttpClient _client = new DefaultHttpClient();
String ret =null;
String api = APIUrl+"procontacts";
URI uri = new URI(api);
JsonObject json = new JsonObject();
json.put("name","tested by JAVA API,created by IT");
json.put("phone","18824158458");
json.put("email","7874100538@qq.com");
json.put("contact_no","7874100538@qq.com");
json.put("country","China");
json.put("city","Guang Zhou");
json.put("fullname","test api by calling with Java");
json.put("creationshop","CN156");
json.put("contactid@odata.bind","/contacts(40a42e1b-9900-ec11-94ef-00224858241d)");
HttpPost post = new HttpPost();
post.setURI(uri);
post.setHeader("Content-Type","application/json");
post.setHeader("Accept","application/json");
post.setHeader("Authorization","Bearer "+_token);
StringEntity entity = null;
try
{
if(json !=null)
{
entity = new StringEntity(json.toString(), StandardCharsets.UTF_8);
post.setEntity(entity);
HttpResponse response = _client.execute(post);
ret = response.toString();
if(String.valueOf(ret).contains("No Content"))
{
System.out.println("Create an contact.");
}
}
else
{
return;
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
private static void testupdateContact(String _token)
{
String api = APIUrl+"procontacts"+"(36e250b6-ae04-ec11-b6e6-000d3aa2e3d2)";
JsonObject json = new JsonObject();
json.put("name","tested by JAVA API(Data patch)");
json.put("phone","18824158458_patch");
json.put("email","787410038@qq.com_patch");
json.put("fullname","fullname test of java call api");
json.put("creationshop","Shop");
json.put("country","China");
json.put("city","GuangZhou");
json.put("contactid@odata.bind","/contacts(40a42e1b-9900-ec11-94ef-00224858241d)");
String b = HttpPatch(api,_token,json);
if(String.valueOf(b).contains("No Content"))
{
System.out.println("Updated.");
}
}
private static void testDeleteContact(String _token)
{
String api = APIUrl+"procontacts"+"(5b7175b3-a404-ec11-b6e6-000d3aa2e3d2)";
String ret = HttpDelete(api,_token);
if(String.valueOf(ret).contains("No Content"))
{
System.out.println("Deleted!");
}
}
private static String testSelectContact(String token) throws Exception {
HttpClient client = new DefaultHttpClient();
String ret = null;
String api = APIUrl+ "accounts?$select=accountid,accountnumber,createdon,telephone1&$top=3";
URI url = new URI(api);
HttpGet get = new HttpGet();
get.setURI(url);
get.setHeader("Content-Type","application/json");
get.setHeader("Accept","application/json");
get.setHeader("Authorization","Bearer "+token);
try
{
HttpResponse response = client.execute(get);
if(response.getStatusLine().getStatusCode()== HttpStatus.SC_OK)
{
ret = EntityUtils.toString((response.getEntity()));
System.out.println(ret);
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
return ret;
}
/**
* patch请求
*author:
* @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;
}
/**
* HttpDelete请求
* @param _url
* @param _token
* @return
*/
public static String HttpDelete(String _url,String _token)
{
String resultobj =null;
HttpClient _client = new DefaultHttpClient();
HttpDelete httpDel = new HttpDelete(_url);
httpDel.setHeader("Content-Type","application/json");
httpDel.setHeader("Accept","application/json");
httpDel.setHeader("Authorization","Bearer "+_token);
try
{
HttpResponse response = _client.execute(httpDel);
resultobj = response.toString();
}
catch (Exception ex)
{
ex.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","787410038@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://YOURURL.crm5.dynamics.com/";
private static String clientId ="XXXXXXX-e055-4f71-b3c0-9cXXX7af3";
private static String username = "CRM ACCOUNT";
private static String password = "CRM PWD";
private static String APIUrl = "https://YOURURL.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://YOURURL.crm5.dynamics.com/";
String clientId ="XXXXX-e055-4f71-b3c0-9c4428f07af3";
String username = "YOUR CRM ACCOUNT";
String password = "YOUR CRM PWD";
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;
}
}
//测试需求,另外封装了一个class
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>