实践基于rest风格的webservice(php,c#)-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 229668
  • 博文数量: 50
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1487
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-24 10:31
文章分类

(50)

  • (50)
文章存档

(20)

(30)

我的朋友
最近访客
相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: web开发

2013-08-31 09:56:15

web服务的风格,从维基百科上查了一下,有不下十几种,但是比较常用的就是rest和rpc。其中,基于soap协议的webservice就是rpc风格的。

rest全称representational state transfer。它是基于无状态的,cs结构的,可以缓存的通信协议。事实上,它是使用 http协议的。某些观点来看,互联网本身就是基于http的,因此也可以认为是一种基于rest风格的webservice。rest风格的webservice对于soap,corba(一种和soap互相竞争的协议)来说,属于轻量级。请求较之于也比较简单。比如,用soap的webservice的请求可能是如下这样的一个xml,有用的信息都被包括在冗余的信息中:




xmlns:soap=""

soap:encodingstyle="">



 

  12345

 






而使用rest的请求就很简单,只是一个url地址:/userdetails/12345,只需要使用浏览器就能验证这个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。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
    
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.= <<    
        $a[1]
        $a[2]
        $a[3]
   

eof;
        }
    }
    $string="\r\n"
            ."\r\n"
            .$string
            ."
";
                                   
    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="\r\n"
            ."\r\n"
            ."  0\r\n"
            ."
\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()."
");
        }
                                       
        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文件。
1
2
3
4
5
    
$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方法。代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    
$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。代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
    
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;
       }
   }

f8fed7f3bb7c4808801fe1fa3ac1c220
阅读(3457) | 评论(0) | 转发(0) |
0

上一篇:

下一篇:

给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图