2013-10-29 14 views
2

我使用Powershell版本3,我想通过Rest获取作为对象的uri上的数据。 我用CmdLedt调用-RestMehtod:通过PowerShell上的Rest获取自定义对象

Invoke-RestMethod services.odata.org/OData/OData.svc/Advertisements?$format=json 

我的输出是:

id  : http://services.odata.org/OData/OData.svc/Advertisements(guid'f89dee73-a 
     f9f-4cd4-b330-db93c25ff3c7') 
category : category 
link  : {link, link, link} 
title : 
updated : 2013-10-29T09:06:33Z 
author : author 
content : content 

但我希望有一个输出,其中ID,名称,广播日是一个对象像这样(2个对象):

Id          Name         Airdate 
--          ----         ------- 
f89dee73-af9f-4cd4-b330-db93c25ff3c7 Old School Lemonade Store, Retro Style 2012-11-07T00:00:00 
db2d2186-1c29-4d1e-88ef-a127f521b9c6 Early morning start, need coffee  2000-02-29T00:00:00 

有人可以解释我怎么可以通过CmdLedt通过休息一个URI返回一个JSON的costum对象吗?

后来我必须在C#代码中使用这个来从URI获取动态对象,它们总是不同的结构。因此,我需要这个CmdLet,因为它通常使动态对象。 在C#到目前为止我的代码:

var args = new string[] { "http://services.odata.org/OData/OData.svc/?$format=json" }; 
var command = string.Format("Invoke-RestMethod {0}", args[0]); 

var results = InvokeCommand.InvokeScript(command); 

回答

1

我用Fiddler比较来自PowerShell中的请求,并从浏览器的请求。

// PowerShell 
GET /OData/OData.svc/Advertisements?=json HTTP/1.1 
// Browser 
GET /OData/OData.svc/Advertisements?$format=json HTTP/1.1 

正如你所看到的,$format会从该网址剥离,你会得到一个atom+xml响应(就像请求http://services.odata.org/OData/OData.svc/Advertisements,所以没有任何URL参数):

Content-Type: application/atom+xml;type=feed;charset=utf-8 

为了解决问题当您使用PowerShell时,您需要转义$

试试这个:

$obj = Invoke-RestMethod -uri "http://services.odata.org/OData/OData.svc/Advertisements?`$format=json" 
$obj.value 

输出(如你预期):

ID          Name         AirDate 
--          ----         ------- 
f89dee73-af9f-4cd4-b330-db93c25ff3c7 Old School Lemonade Store, Retro Style 2012-11-07T00:00:00 
db2d2186-1c29-4d1e-88ef-a127f521b9c6 Early morning start, need coffee  2000-02-29T00:00:00 
+1

谢谢非常mutch!它工作完美:) –

相关问题