[WP8开发] 使用HttpWebRequest和HttpWebResponse向服务器发送Json数据(POST方法)

摘要:
}//从这一步开始,您就可以向服务器发送数据了。HttpWebRequestrequest=WebRequest。创造要求方法=“POST”;要求ContentType=“application/json”;request.ContentLength=json。长IAsyncResultresult=请求。BeginGetRequestStream;}privatevoidGetRequestCallback{HttpWebRequestrequest=asyncResult.AsyncState;使用{sm.Write;}要求BeginGetResponse;}Void GetResponseCallback{Streamstream=null;UploadClassuc=null;//new返回Json数据的实例HttpWebRequestreq=result.AsyncState;WebResponsewebresponse=req.EndGetResponse;stream=webresponse.GetResponceStream();使用{stringcontent=reader.ReadToEnd();uc=newUploadClass()在此回调函数中,UI语句不能直接写入函数体中。需要使用Dispatcher来通知UI更改。如果{Dispatcher.BeginInvoke;}否则{Dispatcher.BeginInvoke(()=˃{//如上所述,根据您自己的UI设置它。});}}在做这个模块的时候,我也参考了许多在线示例,但就像大多数人的通病一样,如果它能正常运行,我就不能运行它。因此,我也排除了各种bug,比如上面评论中写的一些细节。在标题中,我还写了几个关键词供朋友搜索。我希望这个博客能帮助你!
          public string szJson = "";
          byte[] json;
          UploadClass up = new UploadClass();
  
          public ValidatePage()
          {
              InitializeComponent();
          }
  
         private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
         {
             //我做了一个实现上传某些关键的Json数据,返回服务器Appid的功能,类似新浪微博获取AccessToken,不过微博SDK已经封装好了上传功能,比我这个简单许多。
             GetAppid();
         }
 
         void GetAppid()
         {
             up.device = "Luma1020";
             up.devid = "abcdefghijklmn123456";
             up.os = "8.0";
             up.appid = "987654321asdfghjkl";
 
             DataContractJsonSerializer dc = new DataContractJsonSerializer(typeof(UploadClass)); 

             //序列化要发送的信息
             using (MemoryStream ms = new MemoryStream())
             {
                 dc.WriteObject(ms, up);  //报错的原因是UploadClass的类名没有写public
                 json = ms.ToArray();
                 ms.Close(); //一定要关闭流
                 szJson = Encoding.UTF8.GetString(json, 0, json.Length);  //服务器要求用UTF8,就在代码中转换成UTF8,要求用别的就转换成相应的格式。
             }
 
             //从这一步开始,准备向服务器发送数据。
             HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://api.xxxx.com/Api/xxxxx");
             request.Method = "POST";
             request.ContentType = "application/json";
             request.ContentLength = json.Length;
 
             IAsyncResult result = (IAsyncResult)request.BeginGetRequestStream(GetRequestCallback, request);
         }
 
         private void GetRequestCallback(IAsyncResult asyncResult)
         {
             HttpWebRequest request = (HttpWebRequest)asyncResult.AsyncState;
             using (Stream sm = request.EndGetRequestStream(asyncResult))
             {
                 sm.Write(json, 0, json.Length);
             }
             request.BeginGetResponse(GetResponseCallback, request);
         }
 
         void GetResponseCallback(IAsyncResult result)
         {
             Stream stream = null;
             UploadClass uc = null;  //new 一个供返回Json数据的实例
 
             HttpWebRequest req = (HttpWebRequest)result.AsyncState;
             WebResponse webresponse = req.EndGetResponse(result);
             stream = webresponse.GetResponseStream();
             using (StreamReader reader = new StreamReader(stream))
             {
                 string contents = reader.ReadToEnd();
 
                 uc = new UploadClass();
 
                 using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(contents.ToString())))
                 {
                     DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(UploadClass));
                     uc = (UploadClass)ds.ReadObject(ms);
                 }
             }
 
             //这种回调函数中不能直接在函数体里写UI的语句,需要用Dispatcher去通知UI改变。
             if (uc.code == "0")
             {
                 Dispatcher.BeginInvoke
                     (() =>
                     {
                        //这些都是前台UI,下面都是例子:
                         IDTextBlock.Text = "AppId:  " + up.id;
                         DeviceTextBlock.Text = "Device:  " + up.device;
                     }
                     );
             }
 
             else
             {
                 Dispatcher.BeginInvoke(() =>
                 {
                  //和上面一样,根据自己的UI自行设置。
                 });
             }
         }

我在做这个模块时也参考了许多网上的例子,不过和大多数人的通病一样,就是他能正常运行,我就不能运行,因此我也排除了各种BUG,比如上面注释里写道的一些细节。

在标题里我把几个关键词也写上了,便于朋友们搜索,希望这篇博客能帮助你们!

免责声明:文章转载自《[WP8开发] 使用HttpWebRequest和HttpWebResponse向服务器发送Json数据(POST方法)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇px转化rem资源分享-jira jql的常规用法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

【工具技巧】:sublime notepad++ 多行编辑

将光标定位到一行-˃ctrl+shift+↑↓, 上下移动一行。选择-˃ctrl+shift后+↑↓, 上下移动所选区域。再次按6:Ctrl+Shift+Enter在光标前插入一行。...

差分方程的零输入响应与零状态响应

差分方程的迭代分析方法有以下缺点:没有闭合解,不利于数学分析。某个时间的输出只能从头开始计算。本文介绍了差分方程的零输入响应和零状态响应分析方法。对于系统,这种分析方法可以很好地表达系统响应的物理意义=Y[-1]=0$Input Y[n]。回顾零输入响应和零状态响应的迭代计算,我们发现以下规则:$egin{align*}y[0]&=-&qqu...

oracle的序列号(sequence)

Oracle的自动递增列应使用序列号。在初始化阶段,需要手动创建序列,然后在插入序列时手动读取分配给相关字段(如ID)的序列的nextval。这很麻烦。但是,这对于SQL Server来说不是问题,可以获得。oracle的序列号也有缓存。默认情况下,一次生成20个。如果没有用完,它们可能会丢失,这可能会导致ID不一致。此外,有时这可能会引起误解。例如,我有一...

Ubuntu安装时怎样分区

应该首先放置启动分区。并将引导设置为主分区。如果是双系统或多系统安装,通常可以选择逻辑分区。首先,Grub可以在1024柱面后面引导Linux内核;第二,即使有多个Linux安装,/boot也可以完全不共享。此外,非独立/引导分区仅占用根文件夹下约20MB的空间。所以决定是否启动。...

Qt自定义Widget中设置滚动条

用代码自定义一个独立显示的Widget,要在里面画图,同时加上滚动条,滚动条:  printerYuLanPainter=newQPainter();test=newQScrollArea();printerYuLanWidget=newQWidget(test);printerYuLanWidget-˃setMaximumSize(720,1000);pr...

YAML快速入门

基本格式要求1,YAML大小写敏感;2,使用缩进代表层级关系;3,缩进只能使用空格,不能使用TAB,不要求空格个数,只需要相同层级左对齐对象使用冒号代表,格式为key:value。|符号常见用于在YAML中配置HTML片段:phraseTemplate:|sometemplate${msg}5,引用。...