Создание HTTP-СООБЩЕНИЯ в конечную точку REST
-
06-07-2019 - |
Вопрос
Я пытаюсь сделать простую HTTP-публикацию конечной точкой ТОЛЬКО с аргументами url.
По крайней мере, так я понимаю следующие инструкции:
ОТПРАВЬТЕ СООБЩЕНИЕ на этот адрес с единственным параметром с именем url - адрес ленты, который изменился.
Как и в случае с методом XML-RPC, он проверяет, что канал изменился, и, если это так, уведомляет подписчиков.
Событие регистрируется.Возвращаемое значение представляет собой XML-сообщение с именем result с двумя атрибутами: success и msg.
Это мой код в настоящее время:
public static void ping(string feed)
{
HttpWebResponse response = MakeRequest(feed);
XmlDocument document = new XmlDocument();
document.Load(response.GetResponseStream();
string success = document.GetElementById("success").InnerText;
string msg = document.GetElementById("msg").InnerText;
MessageBox.Show(msg, success);
}
private static HttpWebResponse MakeRequest( string postArgument)
{
string url = path + "?" + UrlEncode(postArgument);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
return (HttpWebResponse)request.GetResponse();
}
private static string UrlEncode( string value)
{
string result;
result= HttpUtility.UrlEncode("url") + "=" + HttpUtility.UrlEncode(value);
return result;
}
Я получаю неверный ответ от сервера, поэтому я предполагаю, что каким-то образом делаю это неправильно.вот ответ на этот вопрос:
Недопустимый на верхнем уровне документа.Ресурс обработки ошибок"file:///C:/Users/ADMIN/AppData/Local/Temp/VSD1.tmp.XML ...
рута ^
Есть какие-нибудь идеи??
Заранее спасибо
Решение 3
Вот код, который, как я нашел, работает.
Мы используем HTTP POST, кодируя параметры в теле потока.Это дает нам "url-foobar" в качестве тела содержимого.Никаких типов контента, диспозиций, границ и т.д. В теле.
private static HttpWebResponse MakeRequest(string path, string postArgument)
{
//string url = path + "?" + UrlEncode(postArgument);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(path);
request.Method = "POST";
string boundary = Guid.NewGuid().ToString().Replace("-", "");
request.ContentType = "multipart/form-data; boundary=" + boundary;
Stream stream = request.GetRequestStream();
string result = string.Format("url={0}", postArgument);
byte[] value = Encoding.UTF8.GetBytes(result);
stream.Write(value, 0, value.Length);
stream.Close();
return (HttpWebResponse)request.GetResponse();
}
public static void ping(string server, string feed)
{
HttpWebResponse response = MakeRequest(server, feed);
XmlDocument document = new XmlDocument();
string result = GetString(response.GetResponseStream());
try
{
document.LoadXml(result);
}
catch
{
MessageBox.Show("There was an error with the response", "Error");
}
//MessageBox.Show(msg, success);
}
public static string GetString(Stream thestream)
{
int n = thestream.ReadByte();
byte[] bytes = new byte[n];
thestream.Read(bytes, 0, n);
return Encoding.ASCII.GetString(bytes);
}
Вызовы getString предназначены только для целей отладки и не являются строго необходимыми.
Спасибо всем, кто присоединился сюда за то, что наставили меня на правильный путь.
Другие советы
Я не знаю API .NET, но:Я понимаю инструкции следующим образом:"выполнить публикацию по URL-адресу с аргументами запроса", и в теле публикации должен быть параметр url=foobar.
ИОВ:вместо того чтобы брать postArgument и добавлять его к URL-адресу, вы должны вызвать URL-адрес и предоставить правильно закодированный url=foobar в теле сообщения.
Дополнительно:Я не вижу, чтобы вы устанавливали заголовок запроса 'Accept', что может быть важно, если сервер использует его, чтобы определить, в каком формате отвечать.
Лучший способ сделать публикацию форм в .NET - это использовать класс WebClient.Этот класс сделает правильные действия для отправки данных либо в виде POST (с параметрами в теле объекта), либо в виде GET (с параметрами, закодированными в виде аргументов строки запроса).
И вам нужно показать нам фактическое исключение, которое возвращает клиент, чтобы выяснить, что не так..