locked
WebClient и POST запрос RRS feed

  • Вопрос

  • Добрый день!
    Я только второй день пытаюсь освоиться с мобильной платформой, но столкнулся с проблемой. Я увидел пару примеров о том как можно отправлять POST запросы. Остановился на одном из них, но получаю в конце ошибку. Это связано скорее всего с какимто обновлением.
    Собственно сам код который я пытаюсь сделать:
     
    UploadData
    public void i()
            {
                WebClient client = new WebClient();
                List<RestParametrs> dannie= new List<RestParametrs>();
                var i = new RestParametrs
                {
                    name = "kaka100500"
                };
                dannie.Add(i);
                
                client.UploadValues("http://site.ru/send.php", dannie);
    
            }
    

    и в последней строчке студия мне ругаеться вот таким образом:
    Ошибка 3 "System.Net.WebClient" не содержит определения для "UploadValues" и не был найден метод расширения "UploadValues", принимающий тип "System.Net.WebClient" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку)
    Подскажите что можно сделать?
    з.ы. Если не трудно можете бросить линк где можно посмотреть, как перевести строку такого вида :
    [{"id":1,"name":"Бабслет","Subject":null,"Body":null,"AuthorName":null},{"id":2,"name":"Что попало","Subject":null,"Body":null,"AuthorName":null},{"id":14,"name":"Блеять","Subject":null,"Body":null,"AuthorName":null},{"id":25,"name":"qe","Subject":null,"Body":null,"AuthorName":null}]
    
    в нормальный вид(масив или что то в это роде). То есть, чтобы  можно было применить значения из этой строки к какойто переменной...
    4 января 2012 г. 16:27

Ответы

  • > как перевести строку такого вида :[{"id":1,"name":"Бабслет", [...] в нормальный вид(масив или что то в это роде). 
     
     
    см. Working with JSON Data; Making use of your JSON data in Silverlight
      
     
    • Помечено в качестве ответа ZEONE 10 января 2012 г. 8:29
    4 января 2012 г. 18:38
  • Здравствуйте.

    В вебклиенте для WP7 не определен метод UploadValues, также как и тип NameValueCollection. Доступные методы WP7 класса WebClient можете посмотреть здесь - WebClient - методы.

    Для отправки POST запроса можете использовать следующий код:

    WebClient client = new WebClient(); 
                    client.UploadStringCompleted += new UploadStringCompletedEventHandler(client_UploadStringCompleted); 
                    client.Headers["Content-Type"] = "application/x-www-form-urlencoded"; 
                    client.Encoding = Encoding.UTF8; 
     
                    client.UploadStringAsync(new Uri("http://www.example.com/api/path/"), "POST", "username=username&password=password&query=query"); 
             
            } 
     
            void client_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e) 
            { 
                MessageBox.Show(e.Result); 
            } 
    

    Где username=username&password=password&query=query - те параметры, которые нужно передать.


    Для связи [mail]
    • Предложено в качестве ответа Andy Solo 20 января 2012 г. 18:23
    • Помечено в качестве ответа ZEONE 20 января 2012 г. 21:14
    17 января 2012 г. 8:31

Все ответы

  • > Ошибка 3 "System.Net.WebClient" не содержит определения для "UploadValues"
     
     
    вместо List должен быть NameValueCollection.
    примерно так:
     
    using System;
    using System.Net;
    using System.Collections.Specialized;
    ...
    
    var w = new WebClient();
    var c = new NameValueCollection();
    c.Add("k1", "v1");
    c.Add("k2", "v2");
    w.UploadValues("http://site.net/", c)   // отправит: k1=v1&k2=v2
    
    
     
     
    4 января 2012 г. 18:31
  • > как перевести строку такого вида :[{"id":1,"name":"Бабслет", [...] в нормальный вид(масив или что то в это роде). 
     
     
    см. Working with JSON Data; Making use of your JSON data in Silverlight
      
     
    • Помечено в качестве ответа ZEONE 10 января 2012 г. 8:29
    4 января 2012 г. 18:38
  • Я пытался сделать так но все равно что то не то 8(

     

    5 января 2012 г. 11:00
  • > Я пытался сделать так но все равно что то не то 8(


    пример сериализации коллекции объектов в json.
    строка отсылается на сервер, с которого загружено silverlight app.
    если требуется отсылать на другой сервер, то надо создать crossdomain.xml и clientaccesspolicy.xml

    <UserControl
    	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    	x:Class="SilverlightApplication4.MainPage"
    	Width="640" Height="480">
    	<Grid x:Name="LayoutRoot" Background="White">
    		<Button Content="Test" x:Name="btn" Click="Test_Click" HorizontalAlignment="Left" VerticalAlignment="Top" />
    		<TextBox x:Name="tst" Margin="0,30,0,0" ScrollViewer.VerticalScrollBarVisibility="Visible" TextWrapping="Wrap" />
    	</Grid>	
    </UserControl>
    
    using System;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Json;
    using System.IO;
    using System.Threading;
    
    namespace SilverlightApplication4
    {
    	public class RestParametr
    	{
    		public string Name { get; set; }
    	}
    	
    	[CollectionDataContract]
    	public class RestParametrs : List<RestParametr>
    	{
    	}
    	
    	public partial class MainPage : UserControl
    	{
    		public MainPage()
    		{
    			InitializeComponent();
    		}
    		private void Test_Click(object sender, RoutedEventArgs e)
    		{
    			var url = Application.Current.Host.Source.GetComponents(
    				UriComponents.SchemeAndServer, UriFormat.UriEscaped) + "/TestPage.html";
    			tst.Text = "uploading...\n" + url;
    			
    			var list = new RestParametrs();
    			list.Add(new RestParametr { Name = "n1" });
    			list.Add(new RestParametr { Name = "n2" });
    			
    			string str = null;
    			try
    			{
    				var jsr = new DataContractJsonSerializer(typeof(RestParametrs));
     				var ms = new MemoryStream();
     				jsr.WriteObject(ms, list);
     				str = Encoding.UTF8.GetString(ms.ToArray(), 0, (int)ms.Length);
    				tst.Text += "\n" + str;
    			}
    			catch(Exception exc)
    			{
    				tst.Text = exc.ToString();
    			}
    			
    			var w = new WebClient();
    			w.Headers["Content-type"] = "application/json";
     			w.Encoding = System.Text.Encoding.UTF8;
    			w.UploadProgressChanged += _UploadProgressChanged;
    			w.UploadStringCompleted += _UploadStringCompleted;
    			w.UploadStringAsync(new Uri(url), str);
    		}
    
    		private void _UploadProgressChanged(object sender, UploadProgressChangedEventArgs e)
    		{
    			tst.Text += "\n" + e.BytesSent + " " + e.BytesReceived;
    		}
    		private void _UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
    		{
    			tst.Text += "\n" + e.Result;
    		}
    	}
    }
    
      
     
    5 января 2012 г. 13:15
  • Спасибо большое за пример, только теперь нужно разобраться в его работе 8) Я еще слабоват, но в общих чертах понятно.

     

    А по поводу того что у меня в пространстве имен нету  NameValueCollection у Вас есть какието мысли?

    5 января 2012 г. 14:32
  • попробовал Ваш код простым копипастом чтобы на практике смотреть что к чему, но увы... Опять получил ошибки 8(

    В 2-х слова все ошибки относятся к отсутствию типов в пространстве имен 8( Студия предлагает прописать класс или заглушку...

    Может у меня что то не доустановлено? Пробовал на 2-х студиях (рабочий и домашний пк).

     

    1.  using System.Runtime.Serialization.Json; - Ошибка 1 Имя типа или пространства имен "Json" отсутствует в пространстве имен "System.Runtime.Serialization" (пропущена ссылка на сборку?)

    2. [CollectionDataContract] -  Ошибка 2 Не удалось найти имя типа или пространства имен "CollectionDataContract" (пропущена директива using или ссылка на сборку?)

    3. var url = Application.Current.Host.Source.GetComponents -Ошибка 4 "System.Windows.Interop.SilverlightHost" не содержит определения для "Source" и не был найден метод расширения "Source", принимающий тип "System.Windows.Interop.SilverlightHost" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку)

    4. var jsr = new DataContractJsonSerializer(typeof(RestParametrs)); - Ошибка 5 Не удалось найти имя типа или пространства имен "DataContractJsonSerializer" (пропущена директива using или ссылка на сборку?)

    5 января 2012 г. 20:38
  • С той проблемой частично разобрался, я открыл обозреватель объектов там нашел нужное пространство имен (System.Runtime.Serialization.Json) нажал копировать и потом вставил используя using, в итоге я получил тотже текст, но студия не начала ругаться что Json нету в пространстве имен 8) К сожалению такое не проканало с NameValueCollection(), но так как мне начали сильно жать строки я решил что будет достаточно чтоб телефон только выводил информацию о событиях. Хоть это работает без проблем.

    p.s. Делаю для дипломной 8)

    • Изменено ZEONE 10 января 2012 г. 8:29
    10 января 2012 г. 8:27
  • Здравствуйте.

    В вебклиенте для WP7 не определен метод UploadValues, также как и тип NameValueCollection. Доступные методы WP7 класса WebClient можете посмотреть здесь - WebClient - методы.

    Для отправки POST запроса можете использовать следующий код:

    WebClient client = new WebClient(); 
                    client.UploadStringCompleted += new UploadStringCompletedEventHandler(client_UploadStringCompleted); 
                    client.Headers["Content-Type"] = "application/x-www-form-urlencoded"; 
                    client.Encoding = Encoding.UTF8; 
     
                    client.UploadStringAsync(new Uri("http://www.example.com/api/path/"), "POST", "username=username&password=password&query=query"); 
             
            } 
     
            void client_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e) 
            { 
                MessageBox.Show(e.Result); 
            } 
    

    Где username=username&password=password&query=query - те параметры, которые нужно передать.


    Для связи [mail]
    • Предложено в качестве ответа Andy Solo 20 января 2012 г. 18:23
    • Помечено в качестве ответа ZEONE 20 января 2012 г. 21:14
    17 января 2012 г. 8:31
  • Спасибо за помощь, к сожалению к диплому времен практически не осталось, но на заметку возьму.
    20 января 2012 г. 21:14