[28] Window PowerShell DSC 学习系列----如何用Java调用PowerShell DSC 5.x的oData服务

原创 2017年05月21日 21:38:06

PowerShell DSC 5.x的Report是基于OData V3的标准,而这个标准是微软提出已经标准化的一个开放的工业标准。在我的另外一篇文章中也提到了有下面的几个Java的开源框架支持调用oData的服务。

  1. Apache Olingo: V2 and V4
  2. SDL OData 框架:V4
  3. odata4j: V1-V3
  4. ODataJClient:V3
  5. Jello 框架: Jello 框架


1.介绍

因为PowerShell DSC 5.x的Report是基于OData V3的标准,所以理论上只有odata4j和ODataJClient的框架支持V3版本;但是实际上odata4j宣传支持,其实代码并没有实现。经过研究论证,只有ODataJClient能够支持PowerShell DSC 5.x的Report是基于OData V3的标准的调用。其核心Jar主要包括两个。



2.Maven或者Gradle依赖

如果我们需要使用,则在我们的Gradle或者Maven文件里面,只需要引入odatajclient-engine,odatajclient-engine-xml会自动引入。

<dependency>
	<groupId>com.msopentech.odatajclient</groupId>
	<artifactId>odatajclient-engine</artifactId>
	<version>0.9.0</version>
</dependency>

当前的release版本是0.9.0,当前正在开发的版本是0.9.1-snapshot,感兴趣的朋友可以到下面的网站去Fork代码

https://github.com/mkostin/ODataJClient


3.使用的前提条件

注意使用的前提条件是:


4.代码例子

下面给出1个调用的例子代码,

import java.util.List;
import org.junit.Test;
import com.msopentech.odatajclient.engine.communication.request.retrieve.ODataEntitySetRequest;
import com.msopentech.odatajclient.engine.communication.request.retrieve.ODataRetrieveRequestFactory;
import com.msopentech.odatajclient.engine.communication.response.ODataRetrieveResponse;
import com.msopentech.odatajclient.engine.data.ODataCollectionValue;
import com.msopentech.odatajclient.engine.data.ODataEntity;
import com.msopentech.odatajclient.engine.data.ODataEntitySet;
import com.msopentech.odatajclient.engine.data.ODataLink;
import com.msopentech.odatajclient.engine.data.ODataProperty;
import com.msopentech.odatajclient.engine.format.ODataPubFormat;
import com.msopentech.odatajclient.engine.uri.ODataURIBuilder;

public class RequestEntityTest {
  String testODataServiceRootURL="http://dsc-server:8080/PSDSCPullServer.svc/";
  @Test
  public void testName() throws Exception {
    ODataURIBuilder uriBuilder = new ODataURIBuilder(testODataServiceRootURL).appendEntityTypeSegment("Nodes(AgentId='304DC9EE-12D4-11E7-80B8-B9D2EE16DFG9')/Reports");

    ODataEntitySetRequest req = ODataRetrieveRequestFactory.getEntitySetRequest(uriBuilder.build());
    req.setFormat(ODataPubFormat.ATOM);
    ODataRetrieveResponse<ODataEntitySet> res = req.execute();

    res.getStatusCode();
    res.getStatusMessage();
    res.getContentType();
    res.getEtag();
    res.getHeaderNames();
    res.getHeader("DataServiceVersion");

    ODataEntitySet entitySet = res.getBody();
    System.out.println(entitySet.getCount());
    ODataEntity entity=entitySet.getEntities().get(0);
    
    List<ODataLink> lsODataLink= entity.getAssociationLinks();
    
    lsODataLink.forEach( ODataLink ->
       {
         System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%%%%");
         System.out.println(ODataLink);
       }
     
    );
    
    ODataProperty oDataPropertyJobID=entity.getProperty("JobId");
    System.out.println(".........oDataPropertyJobID:"+oDataPropertyJobID.getValue());
    
    List<ODataProperty> properties = entity.getProperties();
    
    properties.forEach(oDataProperty ->{
      System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
      System.out.println(oDataProperty.getValue());
      if( oDataProperty.hasCollectionValue()){
         System.out.println("---hasCollectionValue---");
         System.out.println(oDataProperty.getName());
         ODataCollectionValue oDataCollectionValue= oDataProperty.getCollectionValue();
         System.out.println(oDataCollectionValue.getTypeName());
         System.out.println(oDataProperty.getPrimitiveValue());
      }
      
      if(oDataProperty.hasComplexValue()){
        System.out.println("---hasComplexValue---");
        System.out.println(oDataProperty.getName());
      }
      
    });
  }
}


注意,下面的代码,没有和DSC Report OData直接相关,但是显示的是示范代码,调用过程类似,另外需要注意的是DSC Report的查询不支持OData的filter的语法,如果要让其支持,请自己定义实现

@获取单个的实体

ODataURIBuilder uriBuilder = new ODataURIBuilder(testODataServiceRootURL).
    appendEntityTypeSegment("Customer(1)");

ODataEntityRequest req = ODataRetrieveRequestFactory.getEntityRequest(uriBuilder.build());
req.setFormat(ODataPubFormat.JSON_FULL_METADATA);

ODataRetrieveResponse<ODataEntity> res = req.execute();

res.getStatusCode();
res.getStatusMessage();
res.getContentType();
res.getEtag();
res.getHeaderNames();
res.getHeader("DataServiceVersion");

ODataEntity entity = res.getBody();

URI editLink = entity.getEditLink();
List<ODataProperty> properties = entity.getProperties();
ODataProperty property = entity.getProperty("Id");
List<ODataLink> navLinks = getNavigationLinks();
List<ODataLink> assLinks = getAssociationLinks();
List<ODataLink> meLinks = getEditMediaLinks();
List<ODataOperation> operations = getOperations();

@获取实体集

ODataURIBuilder uriBuilder = new ODataURIBuilder(testODataServiceRootURL).
  appendEntitySetSegment("Car").top(3);

ODataEntitySetRequest req = ODataRetrieveRequestFactory.getEntitySetRequest(uriBuilder.build());

ODataRetrieveResponse<ODataEntitySet> res = req.execute();
ODataEntitySet entitySet = res.getBody();

URI nextPageLink = getNext();
List<ODataEntity> entities = getEntities();

@Filter的过滤查询

ODataURIBuilder uriBuilder = new ODataURIBuilder(testODataServiceRootURL).
  appendEntityTypeSegment("Car").filter("VIN lt 16");

ODataEntitySet result = ODataRetrieveRequestFactory.getEntitySetRequest(
  uriBuilder.build()).execute().getBody();

具体的查询格式,请参考微软的一篇文章:https://msdn.microsoft.com/en-us/library/dd541437.aspx

@Basic认证调用

// instructs ODataJClient to send a BasicAuth HTTP header 
// for username 'sampleUsername' and password ' samplePassword'
Configuration.setHttpClientFactory(new AbstractBasicAuthHttpClientFactory() {

  @Override
  protected String getUsername() {
    return "sampleUsername";
  }

  @Override
  protected String getPassword() {
    return "samplePassword";
  }
});

// perform any operation via ODataJClient: all requests will bear the BasicAuth HTTP header

// this restores the default unauthenticated behavior
Configuration.setHttpClientFactory(new DefaultHttpClientFactory());


参考文献:

https://github.com/mkostin/ODataJClient/wiki/User-guide-(Engine)

http://blog.csdn.net/chancein007/article/details/54016636

https://github.com/mkostin/ODataJClient





版权声明:本文为博主原创文章,未经博主允许不得转载。

[24]Window PowerShell DSC学习系列---- 如何保护MOF文件里面存储的密码?

在上节笔者分享了[23]Window PowerShell DSC学习系列---- MOF文件能存储用户的密码吗?MOF文件里面能直接存储明文密码,这样是非常不安全的。那么有什么方式能够把MOF里面存...

[23]Window PowerShell DSC学习系列---- MOF文件能存储用户的密码吗?

我们知道,DSC的资源中,有很多的资源是需要访问文件共享目录,进入本地的用户的目录,或者为一个特定的用户安装一个MSI的安装包,修改注册表;这个时候,如果直接执行调用DSC的资源,则可能会弹出“Acc...

[26]Window PowerShell DSC学习系列----如何更换Pull服务器数据库为SQL Server数据库

上节我们提到了如何把PowerShell DSC的数据库换成Access;DSC Pull服务器当前的版本对MS SQL Server是不支持的,该怎么办?另外如果我们需要对Pull服务器建立负载均衡...

[10] Window PowerShell DSC 学习系列----目标节点和Pull 服务器底层通信原理剖析

在本节中,笔者将会用wireshark抓包,并分析目标节点如何和Pull 服务器通信的?注意笔者本机装的Window Management Framework 5.1,如果是其他的版本,可能请求的UR...

[7] Window PowerShell DSC 学习系列----如何被管理的设置节点注册到Pull Server?

在上一节,[6] Window PowerShell DSC 学习系列----如何安装最新的PowerShell DSC 5.1 Pull Server?笔者聊到了如何安装Pull Server。那么...

[20]Window PowerShell DSC学习系列---- start-dscconfiguration 中遇到 Access Denied的解决方案

当我们执行start-DscConfiguration -computername psdsc-window201 -Path c:\DSC\TestFile -Wait -Verbose -forc...

[9] Window PowerShell DSC 学习系列----错误诊断和分析

PowerShell DSC就像一个汽车,内部复杂,司机作为一个普通的用户在使用它,因为知道一些汽车的基本常识,所以当汽车发生一些简单的故障时,可以通过汽车自身带的仪表仪器诊断问题出在哪方面,也可以借...

[17]Windows PowerShell DSC学习系列---使用WMI Tester调用msft-dsclocalconfigurationmanager类的方法

在这边文章中,其列出了DSC中的本地配置管理引擎中的msft-dsclocalconfigurationmanager类,其列出了这个类中的很多方法。比如GetConfigurationStatus,...

[25]Window PowerShell DSC学习系列----如何更换DSC Pull服务器数据库为Access数据库?

我们知道,PowerShell DSC的默认数据库为ESENT文件数据库;或者oleDB形式的Access数据库(数据库文件后缀名为:mdb). 默认安装方式下,如果用xDscWebService D...

[8] Window PowerShell DSC 学习系列----MOF文件和DSC Module的部署

在前面的第7节,笔者分享了如何安装Pull服务器,如何生成MOF文件。那么生成了MOF文件之后,如何在Pull服务器上部署?另外如果MOF文件中又引用了其他的DSC Module或者DSC Resou...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[28] Window PowerShell DSC 学习系列----如何用Java调用PowerShell DSC 5.x的oData服务
举报原因:
原因补充:

(最多只允许输入30个字)