[C#] Не могу придумать куда пихнуть параметры

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by CodeSender:), 7 Sep 2010.

  1. CodeSender:)

    CodeSender:) Active Member

    Joined:
    29 Jul 2010
    Messages:
    245
    Likes Received:
    115
    Reputations:
    23
    Собсна сабж.Куда лучше пихнуть multipart/form-data параметры при пост запросе?Я вот пихал в массив но выглядит как-то не очень...
     
  2. Catbert

    Catbert Banned

    Joined:
    29 Jun 2010
    Messages:
    80
    Likes Received:
    27
    Reputations:
    10
    Представь, что параметры - это огурец
    http://www.youtube.com/watch?v=BxLJX2ZnLW4#t=33
     
  3. Bers

    Bers Member

    Joined:
    17 May 2010
    Messages:
    78
    Likes Received:
    30
    Reputations:
    26
    :) Прошу прощения за простыню кода, но я для работы с HTTP-запросами наваял маленький класс. Дарю :)

    PHP:
    public static class RequestBuilder
    {
        public static 
    HttpWebRequest Get(this HttpWebRequest request)
        {
            
    request.Method "GET";
            return 
    request;
        }

        public static 
    HttpWebRequest CreateRequest(this string uri)
        {
            var 
    request = (HttpWebRequest)WebRequest.Create(uri);
            return 
    request.Timeout(60 1000);
        }
        
        public static 
    HttpWebRequest Cookie(this HttpWebRequest requeststring namestring value)
        {
            if (
    request.CookieContainer == null)
                
    request.CookieContainer = new CookieContainer();

            if (
    value != null && name != null)
                
    request.CookieContainer.Add(new Cookie(namevaluestring.Empty, request.Address.Host));
            return 
    request;
        }

        public static 
    HttpWebRequest Referer(this HttpWebRequest requeststring refer)
        {
            
    request.Referer refer;
            return 
    request;
        }

        public static 
    HttpWebRequest UserAgent(this HttpWebRequest requeststring agent)
        {
            
    request.UserAgent agent;
            return 
    request;
        }

        public static 
    IHttpPostForm Post(this HttpWebRequest requeststring boundary)
        {
            return new 
    HttpPostForm(requestboundary);
        }

        public interface 
    IHttpPostForm
        
    {
            
    IHttpPostForm Include(string namestring value);
            
    IHttpPostForm Include(string namebyte[] buffer);
            
    IHttpPostForm IncludeFile(string namestring filestring contentTypestring value);
            
    IHttpPostForm IncludeFile(string namestring filestring contentTypebyte[] buffer);
            
    HttpWebRequest EndForm();
        }

        private 
    sealed class HttpPostForm IHttpPostForm
        
    {
            
    internal HttpPostForm(HttpWebRequest requeststring boundary)
            {
                
    this.request request;
                
    this.boundary boundary;

                
    request.ContentType string.Format("multipart/form-data;  boundary={0}"boundary);
            }

            public 
    IHttpPostForm Include(string namestring value)
            {
                
    builder.AppendFormat("--{0}\r\n"boundary);
                
    builder.AppendFormat("Content-Disposition: form-data; name=\"{0}\"\r\n"name);
                
    builder.Append("\r\n");
                
    builder.Append(value);
                
    builder.Append("\r\n");
                return 
    this;
            }

            public 
    IHttpPostForm Include(string namebyte[] buffer)
            {
                
    builder.AppendFormat("--{0}\r\n"boundary);
                
    builder.AppendFormat("Content-Disposition: form-data; name=\"{0}\"\r\n"name);
                
    builder.Append("\r\n");
                
    builder.Append(buffer);
                
    builder.Append("\r\n");
                return 
    this;
            }

            public 
    IHttpPostForm IncludeFile(string namestring filestring contentTypestring value)
            {
                
    builder.AppendFormat("--{0}\r\n"boundary);
                
    builder.AppendFormat("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n"namefile);
                
    builder.AppendFormat("Content-Type: {0}\r\n"contentType);
                
    builder.Append("\r\n");
                
    builder.Append(value);
                
    builder.Append("\r\n");
                return 
    this;
            }

            public 
    IHttpPostForm IncludeFile(string namestring filestring contentTypebyte[] buffer)
            {
                
    builder.AppendFormat("--{0}\r\n"boundary);
                
    builder.AppendFormat("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n"namefile);
                
    builder.AppendFormat("Content-Type: {0}\r\n"contentType);
                
    builder.Append("\r\n");
                
    builder.Append(buffer);
                
    builder.Append("\r\n");
                return 
    this;
            }

            public 
    HttpWebRequest EndForm()
            {
                
    builder.AppendFormat("--{0}--"boundary);
                
    request.Method "POST";
                var 
    form builder.ToString();
                var 
    buff Encoding.GetEncoding("windows-1251").GetBytes(form);
                var 
    stream request.GetRequestStream();
                
    stream.Write(buff0buff.Length);
                
    stream.Close();

                return 
    request;
            }

            private 
    readonly StringBuilder builder = new StringBuilder();
            private 
    readonly HttpWebRequest request;
            private 
    readonly string boundary;
        }
    }
    Как им пользоваться:

    PHP:
    HttpWebRequest request RequestBuilder.Create("http://www.google.com/")
                    .
    UserAgent("Mozilla")
                    .
    Referer("localhost")
                    .
    Cookie("name""value")
                    .
    Post()
                        .Include(
    "parameter1""value1")
                        .Include(
    "parameter2""value2")
                        .Include(
    "parameter3""value3")
                        .
    EndForm();
    Не знаю, будет ли полезно, но, по крайней мере можно посмотреть на мою реализацию
     
    1 person likes this.
  4. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Вопрос не плохой, сам задавал его себе когда то.
    Мой совет: сделай функцию для отправки multipart/form-data, которая принимает один из входящих параметров некий тобою созданный класс. В своем классе реализуй метод Add, с помощью которого будешь добавлять различные данные (будь это строка какая то или даже файл).
    Я считаю, что это был бы хороший, юзабилити вариант.