實踐基於REST風格的Webservice(PHP,C#)
WEB服務的風格,從維基百科上查了一下,有不下十幾種,但是比較常用的就是REST和RPC。其中,基於SOAP協議的Webservice就是RPC風格的。
REST全稱Representational State Transfer。它是基於無狀態的,cs結構的,可以快取的通訊協議。事實上,它是使用 HTTP協議的。某些觀點來看,網際網路本身就是基於HTTP的,因此也可以認為是一種基於REST風格的Webservice。REST風格的Webservice對於SOAP,CORBA(一種和SOAP互相競爭的協議)來說,屬於輕量級。請求較之於也比較簡單。比如,用SOAP的Webservice的請求可能是如下這樣的一個XML,有用的資訊都被包括在冗餘的資訊中:
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="
soap:encodingStyle="
<soap:body pb="
<pb:GetUserDetails>
<pb:UserID>12345</pb:UserID>
</pb:GetUserDetails>
</soap:Body>
</soap:Envelope>
而使用REST的請求就很簡單,只是一個URL地址:,只需要使用瀏覽器就能驗證這個REST的Webservice是否正常。HTTP的請求方式有多種,GET,POST,PUT,PATCH,DELETE。REST同樣可以利用這些請求方式。REST的Webservice的響應通常是一個XML檔案,但是和SOAP不同的是,REST並不一定需要響應返回XML檔案,它也可以是CSV格式或者Json格式。
很多公司都採用REST風格的Webservice,比如 Google Glass API,Twitter,Yahoo,Flickr,Amazon等。比如Google有一個Webservice,Google Maps API,它提供2種輸出格式,JSON和XML。地址分別是和
該服務的具體使用方法和引數滿可以查閱https://developers.google.com/maps/documentation/geocoding/?hl=zh-CN&csw=1#XML
演示:
下面演示一個基於PHP語言開發的REST風格的webservice。
<?php
switch($_SERVER['REQUEST_METHOD'])
{
case 'GET':
$id=$_GET["id"];
$arrayid = explode(",", $id);
search($arrayid);
break;
case 'POST':
$id=$_POST["id"];
$username=$_POST["username"];
$sex=$_POST["sex"];
$age=$_POST["age"];
add($id,$username,$sex,$age);
break;
default:
exit();
}
function search($arrayid)
{
$users=getCsvFile("example.csv");
$string="";
foreach($users as $a)
{
$id=$a[0];
if(in_array($id,$arrayid))
{
$string.= <<<EOF
<user id="$a[0]">
<name>$a[1]</name>
<sex>$a[2]</sex>
<age>$a[3]</age>
</user>
EOF;
}
}
$string="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"
."<data>\r\n"
.$string
."</data>";
header("Content-type:application/xml");
print($string);
}
function add($id,$username,$sex,$age)
{
$users=getCsvFile("example.csv");
$string="$id,$username,$sex,$age";
WriteLinetxt($string,"example.csv");
$string="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"
."<return>\r\n"
." <status>0</status>\r\n"
."</return>\r\n";
header("Content-type:application/xml");
print($string);
}
function getCsvFile($filepath)
{
$handle=null;
$returnvalue=array();
try
{
$handle = fopen($filepath,"r");
while ($data = fgetcsv($handle, 1000, ","))
{
array_push($returnvalue,$data);
}
fclose($handle);
}
catch(Exception $e)
{
fclose($handle);
$handle=null;
die("Error!: ".$e->getMessage()."<br/>");
}
return $returnvalue;
}
function WriteLinetxt($content,$filename)
{
file_put_contents($filename, $content."\r\n",FILE_APPEND);
}
?>
程式碼說明:
上述程式碼,根據請求的方式是POST還是GET來區分,如果是GET的話,則需帶上查詢的ID。服務會返回一個Content-type為application/xml的一份xm文件。如果是POST的話,則會把相應的POST進來的值寫入到資料庫。
本例中,資料庫只是簡單的採用CSV檔案,即用逗號分割資料的文字檔案。資料檔案如下:
CBD247FF7AF9473193DC06EB24DBCCC8
由於REST風格的web服務可以透過瀏覽器驗證,因此可以輸入url地址測試。本例中沒有采用url重寫,如果使用url重寫的話,服務地址會更友好。
D87BE31CF24D416BA901BA11EF15A2A6
服務部署好之後,就可以呼叫了。在PHP中,可以透過simplexml_load_file方法,get到這個xml檔案。
<?php
$url="
$response=simplexml_load_file($url);
var_dump($response);
?>
74A2BDE9531F4A879C284A805D575126
透過var_dump,可以看到獲得的直接是一個SimpleXMLElement物件,當然你也可以把它轉換成string物件。
下面用php程式碼實現模擬POST資料。PHP常用的模擬POST動作的方法有3種,分別為Curl、socket、file_get_contents,這裡還是採用file_get_contents方法。程式碼如下:
<?php
$url="
$data = array
(
'id' => '1990',
'username' => '小張',
'sex' => '男',
'age'=>'20'
);
$post_string=http_build_query($data);
$context = array(
'http' => array(
'method' => 'POST',
'header'=>'content-type: application/x-www-form-urlencoded',
'content' => $post_string)
);
$stream_context = stream_context_create($context);
$response = file_get_contents($url, false, $stream_context);
$xml=simplexml_load_string($response);
var_dump($xml);
?>
程式碼中,模擬了POST提交,並且獲得了返回的string,再把string轉成了SimpleXMLElement物件。而且資料庫中資料也已經寫入。
5ABB6024DDF8491FAE0A051F8E524C15
C#版本訪問:
C#也可以透過程式碼呼叫PHP寫的REST風格的Webservice。程式碼如下:
class Program
{
static void Main(string[] args)
{
string[] paramName = { "id" };
string[] paramVal = { "1001,1004" };
var p = HttpGet(" paramName, paramVal);
Console.WriteLine(p);
Console.WriteLine("-------------------------------");
string[] paramName1 = { "id", "username", "sex", "age" };
string[] paramVal1 = { "1030", "tom", "男", "23" };
var p1 = HttpPost(" paramName1, paramVal1);
Console.WriteLine(p1);
}
static string HttpGet(string url, string[] paramName, string[] paramVal)
{
StringBuilder paramz = new StringBuilder();
for (int i = 0; i < paramName.Length; i++)
{
paramz.Append(paramName[i]);
paramz.Append("=");
paramz.Append(HttpUtility.UrlEncode(paramVal[i]));
paramz.Append("&");
}
url += "?" + paramz.ToString();
HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest;
string result = null;
using (HttpWebResponse resp = req.GetResponse() as HttpWebResponse)
{
StreamReader reader = new StreamReader(resp.GetResponseStream());
result = reader.ReadToEnd();
}
return result;
}
static string HttpPost(string url, string[] paramName, string[] paramVal)
{
HttpWebRequest req = WebRequest.Create(new Uri(url)) as HttpWebRequest;
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
// Build a string with all the params, properly encoded.
// We assume that the arrays paramName and paramVal are
// of equal length:
StringBuilder paramz = new StringBuilder();
for (int i = 0; i < paramName.Length; i++)
{
paramz.Append(paramName[i]);
paramz.Append("=");
paramz.Append(HttpUtility.UrlEncode(paramVal[i]));
paramz.Append("&");
}
// Encode the parameters as form data:
byte[] formData = UTF8Encoding.UTF8.GetBytes(paramz.ToString());
req.ContentLength = formData.Length;
// Send the request:
using (Stream post = req.GetRequestStream())
{
post.Write(formData, 0, formData.Length);
}
// Pick up the response:
string result = null;
using (HttpWebResponse resp = req.GetResponse() as HttpWebResponse)
{
StreamReader reader = new StreamReader(resp.GetResponseStream());
result = reader.ReadToEnd();
}
return result;
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69976881/viewspace-2722198/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 基於libcurl實現REST風格http/https的get和postRESTHTTP
- Rest 風格說明REST
- 錢大媽基於 Flink 的實時風控實踐
- SpringMVC(2)-Rest請求風格SpringMVCREST
- rest-api設計風格RESTAPI
- 理解本真的REST架構風格REST架構
- WebService安全機制的思考與實踐Web
- 基於MySql和Sails.js的RESTful風格的api實現MySqlAIJSRESTAPI
- 【閱讀筆記】REST設計風格筆記REST
- C#釋出WebServiceC#Web
- 基於github的CICD實踐Github
- 如何使用dotnet core 編寫REST風格APIRESTAPI
- 雲原生系列6 基於springcloud架構風格的本地debug實現SpringGCCloud架構
- 在C#中基於Semantic Kernel的檢索增強生成(RAG)實踐C#
- 關於C# Span的一些實踐C#
- 基於Bootstrap的Material Design風格表單外掛bootMaterial Design
- 基於SSM風格的Java原始碼生成器SSMJava原始碼
- 基於DevOps的容器安全實踐dev
- pbgo: 基於Protobuf的rpc/rest迷你框架GoRPCREST框架
- 基於TDesign風格的Blazor企業級UI元件庫BlazorUI元件
- 補: Rest 風格請求處理的的內容補充(1)REST
- Hikari:一個基於php的靜態部落格系統PHP
- PHP編碼風格規範PHP
- java框架整合Springmvc+mybatis+shiro+lucene+rest+webservice+mavenJava框架SpringMVCMyBatisRESTWebMaven
- 【實踐篇】基於CAS的單點登入實踐之路
- 基於CMS的元件複用實踐元件
- 基於DataLakeAnalytics的資料湖實踐
- 基於 Spark 的資料分析實踐Spark
- 基於 GraphQL 實踐的一點思考
- 基於 DataLakeAnalytics 的資料湖實踐
- 基於 PageSpeed 的效能優化實踐優化
- 基於Lucene的全文檢索實踐
- 基於 KubeSphere 的分級管理實踐
- 13 個設計 REST API 的最佳實踐RESTAPI
- 基於C#的GRPCC#RPC
- 基於PHP擴充套件的WAF實現PHP套件
- 基於ThinkPHP開發的清新風格部落格系統帶WAP手機版PHP
- 京東零售基於NLP的風控演算法模型構建實踐演算法模型