How to consume Rest Web service in c#

65,279

The exception is pretty clear - you can't use POST if you want to retrieve data from a REST service, unless it allows it. You should use GET instead of POST, or simply don't change request.Method. By default it's GET.

You don't need to do anything special to "consume" REST services - essentially they work just like any other URL. The HTTP POST verb means that you want to create a new resource, or post form data. To retrieve a resource (page, API response etc) you use GET.

This means that you can use any of the HTTP-related .NET classes to call a REST service - HttpClient (preferred), WebClient or raw HttpWebRequest.

SOAP services used POST both for getting and sending data, which is now considered a design mistake by everyone (including the creators of SOAP).

EDIT

To make this clear, using a GET means there is no content and no content related headers or operations are needed or allowed. It's the same as downloading any HTML page:

var url="http://localhost:8000/DEMOService/Client/156";
var webrequest = (HttpWebRequest)System.Net.WebRequest.Create(url);

using (var response = webrequest.GetResponse()) 
using (var reader = new StreamReader(response.GetResponseStream()))
{
    var result = reader.ReadToEnd();
    Label1.Text = Convert.ToString(result);
}

You can even paste the URL directly to a browser to get the same behaviour

Share:
65,279
xav xav
Author by

xav xav

Updated on June 14, 2020

Comments

  • xav xav
    xav xav almost 4 years

    I have written a webservice which on browser launch works fine. I pass a client id in this webservice and then returns a string containing the client name and it which we passed like this: http://prntscr.com/8c1g9z

    My code for creating service is:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ServiceModel;
    using System.ServiceModel.Activation;
    using System.ServiceModel.Web;
    
    namespace RESTService.Lib
    {
        [ServiceContract(Name = "RESTDemoServices")]
        public interface IRESTDemoServices
        {
            [OperationContract]
            [WebGet(UriTemplate = "/Client/{id}", BodyStyle = WebMessageBodyStyle.Bare)]
            string GetClientNameById(string Id);
        }
    
        [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single, IncludeExceptionDetailInFaults = true)]
        [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
        public class RestDemoServices:IRESTDemoServices
        {
            public string GetClientNameById(string Id)
            {
                return ("Le nom de client est Jack et id est : " +Id);
            }
        }
    }
    

    But I am not able to consume it. My code is:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Net.Http;
    using System.Net;
    using System.IO;
    namespace ConsumerClient
    {
        public partial class _Default : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {   
                System.Net.HttpWebRequest webrequest = (HttpWebRequest)System.Net.WebRequest.Create("http://localhost:8000/DEMOService/Client/156");
                webrequest.Method = "POST";
                webrequest.ContentType = "application/json";
                webrequest.ContentLength = 0;
                Stream stream = webrequest.GetRequestStream();
                stream.Close();
                string result;
                using (WebResponse response = webrequest.GetResponse()) //It gives exception at this line liek this http://prntscr.com/8c1gye
                {
                    using (StreamReader reader = new StreamReader(response.GetResponseStream()))
                    {
                        result = reader.ReadToEnd();
                        Label1.Text = Convert.ToString(result);
                    }
                }
            }
        }
    }
    

    I get an exception like this http://prntscr.com/8c1gye How to consume the web service. Could someone please help me ?

  • xav xav
    xav xav over 8 years
    Additional information: Cannot send a content-body with this verb-type. at line Stream stream = webrequest.GetRequestStream(); after GET
  • Panagiotis Kanavos
    Panagiotis Kanavos over 8 years
    Why pass a body? You've defined an action with an Id parameter, with the Id actually as part of the URL. Put the ID in the request Url. A simple web request for http://localhost:8000/DEMOService/Client/156 is enough. Even a WebClient.GetString on the URL will work
  • xav xav
    xav xav over 8 years
    thanks for the answer.. But i have doen the same in consumer code . please see : System.Net.HttpWebRequest webrequest = (HttpWebRequest)System.Net.WebRequest.Create("localhost:8000‌​/DEMOService/Client/‌​156"); But still do nto work
  • Panagiotis Kanavos
    Panagiotis Kanavos over 8 years
    It's the rest of the code that acts as if you are trying to make a POST - you don't need to specify a content type or do anything with the request stream. Just call request.GetResponse() immediately, as you would in when trying to call any URL
  • Amit Kumar Ghosh
    Amit Kumar Ghosh over 8 years
    raw HttWebRequest. is a typo.
  • xav xav
    xav xav over 8 years
    But if you see my GetClientNameById(string Id) function n web service at start. It will only be called when i pass Id.
  • Panagiotis Kanavos
    Panagiotis Kanavos over 8 years
    The exception complains about the request content and headers, not the parameter. GET is like typing the URL in a web browser - if you can get a response in the browser, you can get a response using HttpWebRequest using only the URL
  • Mannam Brahmam
    Mannam Brahmam about 6 years
    Good example of Rest web services in c#.
  • Manish sharma
    Manish sharma about 6 years
    Thanks @Mannam Brahmam!
  • Manish sharma
    Manish sharma about 6 years
    it is very simple example of rest web api.
  • Aisah Hamzah
    Aisah Hamzah almost 5 years
    Actually, this is not a REST consumer example at all, it's an example of a REST service itself, and doesn't show how to consume it. Also, there's a lot of code here that deals with databases which is unrelated to the subject of REST. You may want to improve your answer to show how to consume it.