从JavaScript使用XML WCF REST Web服务

时间:2013-05-03 21:32:52

标签: javascript wcf web-services

我有一个WPF应用程序,它公开了一个REST WCF服务(通过WebServiceHost),其合同看起来像这样(简化):

[ServiceContract]
public interface IItemServiceContract
{
    [WebGet(UriTemplate = "Items/{id}")]
    Item GetItem(string id);

    [WebGet(UriTemplate = "Items")]
    IEnumerable<Item> GetItems();

    [WebInvoke(UriTemplate = "Items", Method = "PUT")]
    IEnumerable<Item> CreateItems(IEnumerable<Item> list);
}

当我使用浏览器导航到http://localhost:8070/Contoso/Services/Items/ItemService/Items时,我得到的响应看起来像这样:

<ArrayOfItem xmlns="http://schemas.datacontract.org/2004/07/Contodo.Services.Items" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <Item>
    <ItemState>
      <Comment i:nil="true"/>
      <DeactivationTime>0001-01-01T00:00:00</DeactivationTime>
      <Id>18f1a5e4-a94a-4f37-a533-3a75a10e7373</Id>
      <IsSpecial>false</IsSpecial>
    </ItemState>
    <ItemTypeId>10</ItemTypeId>
    <HelpInfo/>
    <Identity>Ident1</Identity>
    <AdditionalInfo>
      &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;
      &lt;Content&gt;
        &lt;SpecialContent /&gt;
      &lt;/Content&gt;</AdditionalInfo>
    <TextParameter>kjhdfsjh kj dkfjg kj</TextParameter>
    <UserName i:nil="true"/>
  </Item>
</ArrayOfItem>

使用JavaScript使用此服务的简单且无摩擦的方法是什么?客户端如何快速构建http请求和适当的XML?

我在Html5 / javaScript世界中相当不错,但在C#中我会有一个API,它以Item对象为中心,并被序列化为XML。但这是去的方式吗?

更新:

基于第一个评论和答案,似乎XML不是JavaScript / webbrowser使用者的理想格式,但我不能只将格式更改为JSON,因为这可能会破坏已经依赖此XML的现有客户端格式。理想情况下,我会进行REST内容类型协商,并放置/获取JSON XML。但这可以通过WCF REST服务完成吗?

5 个答案:

答案 0 :(得分:3)

我想您使用的是ASP.NET 4.X。

WCF 4支持基于HTTP“Accept”和“Content-Type”请求标头的automatic format selection。一个在automaticFormatSelectionEnabled="true"文件中指定web.config属性:

<configuration>
  <system.serviceModel>
    <standardEndpoints>
      <webHttpEndpoint>
        <!-- the "" standard endpoint is used for auto creating a web endpoint. -->
        <standardEndpoint name=""
                          helpEnabled="true"
                          automaticFormatSelectionEnabled="true"/>
      </webHttpEndpoint>
    </standardEndpoints>
  </system.serviceModel>
</configuration>

有关详细信息,请参阅the articlethe article的“消息格式选择”部分。您可以将automaticFormatSelectionEnabled属性与defaultOutgoingResponseFormat(可以设置为“xml”或“json”,默认为“xml”)组合。您可以仅为一个特定端点指定属性,而不是像上例中那样使用standardEndpoint

因此,您的现有WCF服务将仅为JavaScript请求提供JSON数据,如果您使用相应的WCF配置,仍会为其他客户端返回XML数据。

答案 1 :(得分:1)

试试这个

对于Json Type结果

在InterFace中

         [WebInvoke(Method = "POST", UriTemplate = "/ItemGetItem?id={id}", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        [OperationContract]
        void  ItemGetItem(string id);

脚本

self.GetItem= function () {

         try {

             $.ajax({
                 type: "POST",
                 url: "Your Url",
                 contentType: 'application/json',
                 async: false,
                 dataType: 'json',
                 cache: false,
                 success: function (response) {




                 },
                 error: function (ErrorResponse) {


                 }

             });

         }

         catch (error) {


         }

     }

将客户端应用程序的端点用于使用此服务

答案 2 :(得分:1)

结帐WcfRestContribthis答案也可以帮助你。

答案 3 :(得分:0)

你看到http://www.codeproject.com/Articles/33234/A-beginner-s-guide-for-consuming-a-WCF-service-in

的所有拳头

但我认为最简单的方法是将格式更改为Json。关于代码项目的文章也很好:http://www.codeproject.com/Articles/327420/WCF-REST-Service-with-JSON

答案 4 :(得分:0)

如果您使用的是jQuery,则可以使用$ .get函数(http://api.jquery.com/jQuery.get/)并将“xml”指定为数据类型:

$.get('http://.../', params, function(data) {
 //process data
}, 'xml');

如果没有,您需要直接使用xmlHttpRequest(来自http://www.w3schools.com/xml/xml_parser.asp):

  if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp=new XMLHttpRequest();
  }
  else
  {// code for IE6, IE5
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
  xmlhttp.open("GET",url,false);
  xmlhttp.send();
  xmlDoc=xmlhttp.responseXML;

然后使用本机javascript xml解析器遍历xml节点相当容易。

但是JSON会更合适。 您可以为http://localhost:8070/Contoso/Services/Items/ItemService/Items.json添加一条路径,该路由将以JSON格式返回结果。或者在网址中添加参数。 只有在您明确要求时,这两种方法都将返回JSON。因此,使用xml响应的现有代码仍然可以正常工作。