Создание HTTP POST для конечной точки REST - PullRequest
1 голос
/ 28 октября 2009

Я пытаюсь сделать простой пост HTTP конечной точкой с ТОЛЬКО аргументами URL.

По крайней мере, так я понимаю следующие инструкции:

POST по этому адресу с одним параметром с именем 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 ]

1 голос
/ 28 октября 2009

Лучший способ сделать пост формы в .NET - это использовать класс WebClient. Этот класс будет правильно выполнять отправку данных в виде POST (с параметрами в теле сущности) или в виде GET (с параметрами, закодированными как аргументы строки запроса).

И вам нужно показать нам фактическое исключение, которое клиент возвращает, чтобы выяснить, что не так ..

1 голос
/ 28 октября 2009

Вот код, который я нашел для работы.

Мы используем 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 предназначены только для целей отладки и не являются строго необходимыми.

Спасибо всем, кто зашел сюда за то, что поставил меня на правильный путь.

1 голос
/ 28 октября 2009

Я не знаю API .NET, но: я понимаю инструкции как: «выполнить публикацию по URL с аргументами запроса», а в теле сообщения должен быть параметр url = foobar.

IOW: вместо взятия postArgument и добавления его к URL-адресу, вы должны вызвать URL-адрес и предоставить правильно закодированный url = foobar в теле сообщения.

Дополнительно: я не вижу, чтобы вы устанавливали заголовок запроса «Принять», что может быть важно, если сервер использует его для распознавания формата ответа.

...