C# 基于HTTP的Web服务XML

C# 基于HTTP的Web服务XML,c#,.net,xml,web-services,http,C#,.net,Xml,Web Services,Http,我正在尝试使用一个不使用SOAP和WSDL的web服务,但我不知道如何做到这一点。我真的很想得到一些建议 该服务的API为: 其中id是参数 支持的请求方法是GET 我可以用这样的东西吗: var myReq = new XMLHttpRequest(); var url = "http://someaddress.com/webservices/name/2" myReq.open("GET", url, true); myReq.send(); 这里有一段代码可以帮助你做到这一点 publ

我正在尝试使用一个不使用SOAP和WSDL的web服务,但我不知道如何做到这一点。我真的很想得到一些建议

该服务的API为:

其中id是参数

支持的请求方法是GET

我可以用这样的东西吗:

var myReq = new XMLHttpRequest();
var url = "http://someaddress.com/webservices/name/2"
myReq.open("GET", url, true);
myReq.send();

这里有一段代码可以帮助你做到这一点

public static string SendRequest(string uri, string method, string contentType, string body)
{
    string responseBody = String.Empty;

    HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(new Uri(uri));
    req.Method = method;
    if (!String.IsNullOrEmpty(contentType))
    {
        req.ContentType = contentType;
    }
    if (!String.IsNullOrEmpty(body))
    {
        byte[] bodyBytes = Encoding.UTF8.GetBytes(body);
        req.GetRequestStream().Write(bodyBytes, 0, bodyBytes.Length);
        req.GetRequestStream().Close();
    }

    HttpWebResponse resp;
    try
    {
        resp = (HttpWebResponse)req.GetResponse();
    }
    catch (WebException e)
    {
        resp = (HttpWebResponse)e.Response;
    }

    Stream respStream = resp.GetResponseStream();
    if (respStream != null)
    {
        responseBody = new StreamReader(respStream).ReadToEnd();
    }

    return responseBody;
}

这里有一段代码可以帮助你做到这一点

public static string SendRequest(string uri, string method, string contentType, string body)
{
    string responseBody = String.Empty;

    HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(new Uri(uri));
    req.Method = method;
    if (!String.IsNullOrEmpty(contentType))
    {
        req.ContentType = contentType;
    }
    if (!String.IsNullOrEmpty(body))
    {
        byte[] bodyBytes = Encoding.UTF8.GetBytes(body);
        req.GetRequestStream().Write(bodyBytes, 0, bodyBytes.Length);
        req.GetRequestStream().Close();
    }

    HttpWebResponse resp;
    try
    {
        resp = (HttpWebResponse)req.GetResponse();
    }
    catch (WebException e)
    {
        resp = (HttpWebResponse)e.Response;
    }

    Stream respStream = resp.GetResponseStream();
    if (respStream != null)
    {
        responseBody = new StreamReader(respStream).ReadToEnd();
    }

    return responseBody;
}

WebClient对象对于这类任务做得非常好。

WebClient对象对于这类任务做得非常好。

获取xml的最简单方法是使用url作为XDocument.Load()方法的参数

此方法从远程url获取数据,使用XmlReader解析数据,然后构造XDocument对象。然后,您可以使用LINQ转换为XML来查询或转换数据

不幸的是,这不适用于POST、DELETE、PUT http请求

编辑: 这取决于您的服务以及您可以使用它执行的操作:

  • 使用
    XDocument.Load()
    是最简单的解决方案。如果这是internet上的一个简单资源,没有身份验证,不需要HTTp头,只支持GET请求,那么这就是解决方法。您可以编写一个方法,该方法接受您的参数并将它们附加到URL中

    public SomeClass GetSomeEntity(string id) 
    {
        var xml = XDocument.Load("http://mywebservice.com/ws/" + id);
        // transform xml into an instance of actual type
    }
    
  • 使用WebClient,您可以更好地控制HttpRequest。您可以设置基本身份验证凭据、附加其他HTTP头、发布表单数据等。您还可以使用“异步”方法

    using (var client = new WebClient()) 
    {
       var xml = XDocument.Load(client.OpenRead("http://yoururl.com");
       // process xml
    } 
    
  • 您可以将“HttpWebRequest”视为web请求的低级实现


  • 获取xml的最简单方法是将url用作XDocument.Load()方法的参数

    此方法从远程url获取数据,使用XmlReader解析数据,然后构造XDocument对象。然后,您可以使用LINQ转换为XML来查询或转换数据

    不幸的是,这不适用于POST、DELETE、PUT http请求

    编辑: 这取决于您的服务以及您可以使用它执行的操作:

  • 使用
    XDocument.Load()
    是最简单的解决方案。如果这是internet上的一个简单资源,没有身份验证,不需要HTTp头,只支持GET请求,那么这就是解决方法。您可以编写一个方法,该方法接受您的参数并将它们附加到URL中

    public SomeClass GetSomeEntity(string id) 
    {
        var xml = XDocument.Load("http://mywebservice.com/ws/" + id);
        // transform xml into an instance of actual type
    }
    
  • 使用WebClient,您可以更好地控制HttpRequest。您可以设置基本身份验证凭据、附加其他HTTP头、发布表单数据等。您还可以使用“异步”方法

    using (var client = new WebClient()) 
    {
       var xml = XDocument.Load(client.OpenRead("http://yoururl.com");
       // process xml
    } 
    
  • 您可以将“HttpWebRequest”视为web请求的低级实现


  • 查看-它向您展示了使用WCF基础设施创建REST服务(无SOAP)的方便性和效率。

    查看-它向您展示了使用WCF基础设施创建REST服务(无SOAP)的方便性和效率。

    据我所知,使用JQuery是最简单的。如果这在您的情况下有效,请尝试:

    var param = new Object();
        param.id = 2;
    
        $.ajax({
            type: "GET",
            url: "http://someaddress.com/webservices/name",
            data: $.toJSON(param),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (msg) {
                if (msg.d) {
                  //do something 
                } 
            }
        });
    

    据我所知,使用JQuery是最简单的。如果这在您的情况下有效,请尝试:

    var param = new Object();
        param.id = 2;
    
        $.ajax({
            type: "GET",
            url: "http://someaddress.com/webservices/name",
            data: $.toJSON(param),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (msg) {
                if (msg.d) {
                  //do something 
                } 
            }
        });
    

    谢谢与AJC的示例相比,使用这个非常简单的方法有什么缺点吗?您没有控制公开的http请求:没有自定义头,没有基本的身份验证,没有异步方法。然而,如果这是一个简单的资源在互联网上,你只能“获取”它与参数在您的url比这更简单solution@Andy如果XDocument.Load满足了您的需求,那么Vasile是正确的,这是获取xml的最简单形式。这两种方法都有效,请为自己选择合适的方法,不要忘记选择一个解决方案,这样其他偶然发现这个问题的人也可以从中受益+为了简单起见,谢谢!与AJC的示例相比,使用这个非常简单的方法有什么缺点吗?您没有控制公开的http请求:没有自定义头,没有基本的身份验证,没有异步方法。然而,如果这是一个简单的资源在互联网上,你只能“获取”它与参数在您的url比这更简单solution@Andy如果XDocument.Load满足了您的需求,那么Vasile是正确的,这是获取xml的最简单形式。这两种方法都有效,请为自己选择合适的方法,不要忘记选择一个解决方案,这样其他偶然发现这个问题的人也可以从中受益+1为简单起见。