Как я могу вызвать веб-сервис из C# с HTTP POST
Я хочу написать класс aC#, который бы создавал соединение с веб-сервисом, работающим на www.temp.com, отправлял 2 строковых параметра в метод DoSomething и получал строковый результат. Я не хочу использовать WSDL. Поскольку я знаю параметры веб-сервиса, я просто хочу сделать простой звонок.
Я полагаю, что в.Net 2 должен быть легкий и простой способ сделать это, но я не смог найти ни одного примера...
4 ответа
Если этот "веб-сервис" является простым HTTP GET, вы можете использовать WebRequest:
WebRequest request = WebRequest.Create("http://www.temp.com/?param1=x¶m2=y");
request.Method="GET";
WebResponse response = request.GetResponse();
Оттуда вы можете посмотреть на response.GetResponseStream для вывода. Вы можете воспользоваться услугой POST таким же образом.
Однако, если это веб-сервис SOAP, это не так просто. В зависимости от безопасности и параметров веб-службы, иногда вы можете взять уже сформированный запрос и использовать его в качестве шаблона - заменить значения параметров и отправить его (с помощью веб-запроса), а затем проанализировать ответ SOAP вручную... но в этом случае вы смотрите на много дополнительной работы, а может просто использовать wsdl.exe
генерировать прокси.
Я хотел бы изучить использование ASP.NET MVC для вашего веб-сервиса. Вы можете предоставить параметры через стандартные параметры формы и вернуть результат в виде JSON.
[HttpPost]
public ActionResult MyPostAction( string foo, string bar )
{
...
return Json( new { Value = "baz" } );
}
В вашем клиенте используйте HttpWebRequest
var request = WebRequest.Create( "/controller/mypostaction" );
request.Method = "POST";
var data = string.Format( "foo={0}&bar={1}", foo, bar );
using (var writer = new StreamWriter( request.GetRequestStream() ))
{
writer.WriteLine( data );
}
var response = request.GetResponse();
var serializer = new DataContractJsonSerializer(typeof(PostActionResult));
var result = serializer.ReadObject( response.GetResponseStream() )
as PostActionResult;
где у вас есть
public class PostActionResult
{
public string Value { get; set; }
}
Еще один способ вызова метода POST, я использовал для вызова метода POST в WebAPI.
WebClient wc = new WebClient();
string result;
wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
result = wc.UploadString("http://localhost:23369/MyController/PostMethodName/Param 1/Param 2","");
Response.Write(result);
Вы можете вернуть объект List, используя Newtonsoft.Json:
WebClient wc = new WebClient();
string result;
wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
var data = string.Format("Value1={0}&Value2={1}&Value3={2}", "param1", "param2", "param3");
result = wc.UploadString("http:your_services", data);
var ser = new JavaScriptSerializer();
var people = ser.Deserialize<object_your[]>(result);
Это статический метод для вызова любой службы без учетных данных
/// <summary>
/// Connect to service without credentials
/// </summary>
/// <param name="url">string url</param>
/// <param name="requestType">type of request</param>
/// <param name="objectResult">expected success object result</param>
/// <param name="objectErrorResult">expected error object result</param>
/// <param name="objectErrorResultDescription">expected error object description</param>
/// <param name="body">request body</param>
/// <param name="bodyType">type of body</param>
/// <param name="parameters">parameters of request</param>
/// <returns></returns>
public static object ConnectToService(string url, string model, RequestType requestType, string objectResult, string objectErrorResult,
string objectErrorResultDescription, string body = null, string bodyType = null,
string parameters = null)
{
try
{
HttpClient client = new HttpClient();
string tokenEndpoint = url;
StringContent stringContent;
string result = string.Empty;
switch (requestType)
{
case RequestType.Get:
{
var returnRequest = client.GetAsync(tokenEndpoint).Result;
result = returnRequest.Content.ReadAsStringAsync().Result;
break;
}
case RequestType.Post:
{
stringContent = new StringContent(body, Encoding.UTF8, bodyType);
var returnRequest = client.PostAsync(tokenEndpoint, stringContent).Result;
result = returnRequest.Content.ReadAsStringAsync().Result;
break;
}
case RequestType.Put:
{
stringContent = new StringContent(body, Encoding.UTF8, bodyType);
var returnRequest = client.PutAsync(tokenEndpoint, stringContent).Result;
result = returnRequest.Content.ReadAsStringAsync().Result;
break;
}
case RequestType.Delete:
{
var returnRequest = client.DeleteAsync(tokenEndpoint).Result;
result = returnRequest.Content.ReadAsStringAsync().Result;
break;
}
default:
break;
}
JObject jobject = !string.IsNullOrEmpty(result) ? JObject.Parse(result) : null;
var obj = jobject != null ? (jobject[objectResult]?.ToList()?.Count > 0 ? jobject[objectResult]?.ToList() : null) : null;
return (obj == null && jobject?.ToString() == null && jobject[objectResult]?.ToString() == null) ? throw new Exception(($"{jobject[objectErrorResult]?.ToString()} - {jobject[objectErrorResultDescription]?.ToString()}") ?? (new { Error = new { Code = 400, Message = $"{model} - Requisição inválida." } }).ToString()) : (obj ?? (object)jobject[objectResult]?.ToString()) == null ? jobject : (obj ?? (object)jobject[objectResult]?.ToString());
}
catch (NullReferenceException)
{
return null;
}
catch (Exception e)
{
throw new Exception($"{model} - Requisição inválida. Detalhes: {e.Message ?? e.InnerException.Message}");
}
}
Это статический метод для вызова любой службы с учетными данными
/// <summary>
/// Connect to service with credentials
/// </summary>
/// <param name="url">string url</param>
/// <param name="requestType">type of request</param>
/// <param name="handler">credentials</param>
/// <param name="objectResult">expected success object result</param>
/// <param name="objectErrorResult">expected error object result</param>
/// <param name="objectErrorResultDescription">expected error object description</param>
/// <param name="body">request body</param>
/// <param name="bodyType">type of body</param>
/// <param name="parameters">parameters of request</param>
/// <returns></returns>
public static object ConnectToService(string url, string model, RequestType requestType, HttpClientHandler handler, string objectResult, string objectErrorResult,
string objectErrorResultDescription, string body = null, string bodyType = null,
string parameters = null)
{
try
{
HttpClient client = new HttpClient(handler);
string tokenEndpoint = url;
StringContent stringContent;
string result = string.Empty;
switch (requestType)
{
case RequestType.Get:
{
var returnRequest = client.GetAsync(tokenEndpoint).Result;
result = returnRequest.Content.ReadAsStringAsync().Result;
break;
}
case RequestType.Post:
{
stringContent = new StringContent(body, Encoding.UTF8, bodyType);
var returnRequest = client.PostAsync(tokenEndpoint, stringContent).Result;
result = returnRequest.Content.ReadAsStringAsync().Result;
break;
}
case RequestType.Put:
{
stringContent = new StringContent(body, Encoding.UTF8, bodyType);
var returnRequest = client.PutAsync(tokenEndpoint, stringContent).Result;
result = returnRequest.Content.ReadAsStringAsync().Result;
break;
}
case RequestType.Delete:
{
var returnRequest = client.DeleteAsync(tokenEndpoint).Result;
result = returnRequest.Content.ReadAsStringAsync().Result;
break;
}
default:
break;
}
JObject jobject = !string.IsNullOrEmpty(result) ? JObject.Parse(result) : null;
var obj = jobject != null ? (jobject[objectResult]?.ToList()?.Count > 0 ? jobject[objectResult]?.ToList() : null) : null;
return (obj == null && jobject?.ToString() == null && jobject[objectResult]?.ToString() == null) ? throw new Exception(($"{jobject[objectErrorResult]?.ToString()} - {jobject[objectErrorResultDescription]?.ToString()}") ?? (new { Error = new { Code = 400, Message = $"{model} - Requisição inválida." } }).ToString()) : (obj ?? (object)jobject[objectResult]?.ToString()) == null ? jobject : (obj ?? (object)jobject[objectResult]?.ToString());
}
catch (NullReferenceException)
{
return null;
}
catch (Exception e)
{
throw new Exception($"{model} - Invalid request. {e.Message.Split(',')[0] ?? e.InnerException.Message.Split(',')[0]}");
}
}