|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
语言是不是不是最重要的?标题有些年夜,但文中谈到的成绩很小;看似表彰C#,实践不是。
这个小成绩来自如许的使用场景——以HTTPPOST的体例挪用第三方API,第三方API不撑持JSON传参,只能经由过程URLquerystring体例传参(a=1&b=2)。
假定API的地点是http://www.ckuyun.com/api/say,必要传送的参数是username与words,只撑持HTTPPOST挪用。
别的,加一个束缚前提——不同意用字符串拼接,好比:"username="+username+"&words="+words;
jQuery中的挪用示例代码
- varpostData={username:test,words:helloworld};$.ajax({url:http://www.ckuyun.com/api/say,data:postData,type:post,});
复制代码
在下面的Javascript代码实行时,jQuery会主动将js对象postData转换为Urlquerystring的情势(username=test&words=hello+world),并主动举行Urlencode。
PHP中的挪用示例代码
- $url=http://www.ckuyun.com/api/say;$data=array(username=>test,words=>helloworld);$data=http_build_query($data);$ch=curl_init();curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_POST,1);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);curl_setopt($ch,CURLOPT_POSTFIELDS,$data);$response=curl_exec($ch);curl_close($ch);
复制代码
PHP内置的http_build_query()函数能主动将数组转换为Urlquerystring的情势(username=test&words=hello+world),并主动举行Urlencode。
C#中的挪用示例代码
1、在.NETFramework4.0中的完成(HttpWebRequest+匿名范例+反射+LINQ)
参数经由过程匿名范例(AnonymousType)举行界说:
- varpostData=new{username="test",words="helloworld"};
复制代码 .NETFramework4.0的类库中没有供应间接将“匿名范例实例”转换为“Url查询参数”的API,只能借助“反射+LINQ”本人完成。完成代码以下:
- staticvoidMain(string[]args){varurl="http://www.ckuyun.com/api/say";varpostData=new{username="test",words="helloworld"};varwebRequest=WebRequest.Create(url)asHttpWebRequest;webRequest.Method="post";webRequest.ContentType="application/x-www-form-urlencoded";varqueryString=string.Join("&",frompinpostData.GetType().GetProperties()selectp.Name+"="+HttpUtility.UrlEncode(p.GetValue(postData,null).ToString()));using(varsw=newStreamWriter(webRequest.GetRequestStream())){sw.Write(queryString);}using(varresponse=webRequest.GetResponse()){using(varsr=newStreamReader(response.GetResponseStream())){Console.WriteLine(sr.ReadToEnd());}}}
复制代码
2、在.NETFramework4.5中的完成(HttpClient+FormUrlEncodedContent)
.NETFramework4.5思索到了这个使用场景,供应了FormUrlEncodedContent,但它不撑持匿名范例(AnonymousType),只撑持字典(Dictionary)。参数必要如许界说:
- varpostData=newDictionary<string,string>{{"username","test"},{"words","helloworld"}};
复制代码 完全完成代码以下(必要援用System.Net.Http):
- staticvoidMain(string[]args){varurl="http://www.ckuyun.com/api/say";varpostData=newDictionary<string,string>{{"username","test"},{"words","helloworld"}};varurlEncodedContent=newFormUrlEncodedContent(postData);varhttpClient=newHttpClient();varresult=httpClient.PostAsync(url,urlEncodedContent).Result.Content.ReadAsStringAsync().Result;Console.WriteLine(result);}
复制代码
.NETFramework4.5中的完成还算复杂,可是FormUrlEncodedContent只撑持Dictionary,思索仍是不周密。
感受
.NET因互联网而生,而经由过程URLquerystring传参的需求在互联网使用中一般存在,但.NET从4.5才入手下手思索这个使用场景,其实有点说不外往。
我之所以想学。NET,是因为一直觉的BILLGATES好厉害,希望有一天能去微软,虽然现在还距离遥远,呵呵:) |
|