How to consume Rest Web service in c#
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
xav xav
Updated on June 14, 2020Comments
-
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 over 8 yearsAdditional information: Cannot send a content-body with this verb-type. at line Stream stream = webrequest.GetRequestStream(); after GET
-
Panagiotis Kanavos over 8 yearsWhy 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 aWebClient.GetString
on the URL will work -
xav xav over 8 yearsthanks 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 over 8 yearsIt'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 over 8 years
raw HttWebRequest.
is a typo. -
xav xav over 8 yearsBut if you see my GetClientNameById(string Id) function n web service at start. It will only be called when i pass Id.
-
Panagiotis Kanavos over 8 yearsThe 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 about 6 yearsGood example of Rest web services in c#.
-
Manish sharma about 6 yearsThanks @Mannam Brahmam!
-
Manish sharma about 6 yearsit is very simple example of rest web api.
-
Aisah Hamzah almost 5 yearsActually, 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.