山西企业网站开发:将WordPress用作移动应用程序的RESTAPI

2019.05.27 山西企业网站开发

150

通常,山西企业网站开发当你制作移动应用程序时,你需要你的应用程序从你的网站上获取最新的内容,或者如果没有一个已经有内容的网站,你就需要将新的或及时的内容放入移动应用程序中。

当然,你不想通过iTunes、Play Store或其他什么更新你的应用程序,因为你必须等待人们在看到新内容之前进行升级。您想要设置您的移动应用程序,以调用服务器,并要求最新的东西本身。

使用RESTAPI和JSON来交付内容必须是最简单的方法。

为什么要使用JSON/RESTAPI而不是Ajax呢?

从本质上讲,山西企业网站开发在Ajax的设计中,您将面临的问题是Ajax调用只能针对当前页面正在传递的域。嗯,由于您正在使用移动应用程序,可能没有域,因此您不能使用Ajax。这是众所周知的相同的原产地政策,并是一个安全保障强加给开发人员。

但是,如果正确使用JSON(JavaScript对象表示法)而不是Ajax调用,就有可能绕过这个问题。对API进行JSON调用使用的技术与从另一个域加载Javascript文件时使用的技术相同。许多人通过使用GoogleCDN版本的jQuery来实现这一点,他们从Google域加载jQuery,而不是从自己的域加载jQuery。

当我们进行JSON调用时,我们所做的就是从服务器加载一个新脚本。下面是您将在手机应用程序中使用的代码:

function loadJSON(url) {
  var headID = document.getElementsByTagName("head")[0];
  var newScript = document.createElement('script');
      newScript.type = 'text/javascript';
      newScript.src = url;       
  headID.appendChild(newScript);}

我在这里使用Javascript作为语言,许多开发工具都使用它(电话间隔、Appcelerrator、App加热炉等)。它所做的就是以URL作为输入,并在头中创建一个新的脚本标记,将URL作为Javascript文件加载。

JSONP和JSON有什么区别?

JSONP和JSON更不一样。只有一个小的区别,JSON只回答数据,JSONP回答数据和封装数据的回调进程。这里有两个例子,URL使用面板打开图形来用JSON和JSONP进行回复。两个URL的唯一不同之处在于GET变量的使用callback=

http:/Graph.facebook.com/?id=https:/speckybel.com

{
   "id": "https://speckyboy.com",
   "shares": 608}

http:/Graph.facebook.com/?id=https:/speckybel.com&callback=doThisFunction

/**/ doThisFunction({
   "id": "https://speckyboy.com",
   "shares": 608});

正如您所看到的,我已经告诉Facebook使用一个JSONP请求进行回复,使用回调并要求它进行“doThisFunction”回调。

这意味着,当应答从服务器返回时,它将数据发送到名为doThisFunction()

function doThisFunction(data){
  alert('the page ' + data.id + ' has been shared ' + data.shares + ' times');}

上面的函数将接受通过回调发送给它的数据(JSON对象),然后发出一个警报,显示一些文本、页面url和共享计数。

这里需要注意的重要部分是JSON点表示法的使用。点表示法是用来访问JSON对象中的数据的方法。在这种情况下data.id显示url(id对象的内容),以及data.shares显示共享计数(共享对象的内容)。

如果您对此感兴趣,请单击此处。

现在继续使用WordPress

WordPress很棒,我喜欢。正如我之前说过的,我的妈妈、祖母和女朋友可以不用每5秒就问我该怎么做,所以它很容易使用。考虑到这一点,它是保存数据的完美管理平台。很容易将其转变为RESTAPI。

必须说,如果我要让一个世界级的企业准备好RESTAPI,我不会使用WordPress作为前端,也许是用于后端CMS管理,而不是前端。要获得这样一组特定的数据,它做得太多了,而且老实说,PHP并不是世界上最快的语言。然而,为博客提供一个API方法,以便通过API访问最新的帖子,这一切都不属于这一范畴。如果您对我在世界级企业环境中使用的内容感兴趣,我很可能使用node.js,或者可能使用Python,但这完全是另一回事。

好的,在序言中,我要做一个非常简单的方法来执行REST回复,以JSON对象的形式给出最新的10个帖子。我将不再编写一个插件来管理这个插件(我通常会这样做),而是编写一个非常简单的页面模板,名为“REST博客列表”。我选择写一个页面模板,这样我就可以在很大程度上控制加载的内容。

为此,我们需要以下功能:

  • 读取URL和检查GET变量的一种方法


    函数Checkurl_vars()

  • 对变量进行卫生处理,这样当我们拯救它们的时候,我们就知道我们不会让肮脏的东西进入我们的大门。


    函数Save_url_vars()和函数sanatize_vars()

  • 检查请求是针对JSON对象还是JSONP对象,并使用正确的内容进行答复


    函数Save_url_vars()

  • 打电话给WordPress数据库,查看最新发布的博客文章


    函数make_loop()

  • 使用构造函数使进程自动化


    函数_construt()

  • 之后使用析构函数来清理


    函数_destruct()

  • 一种处理错误的方法


    函数错误()

  • 将输出发送回客户端,并在可能的情况下对其进行GZIP‘


    函数SendOutput()

如果您知道您的PHP,您就会知道我们将使用一个类来处理这个问题。我们将把它直接放到页面模板中,只是为了让它变得简单,但是这也可以很容易地通过WordPress插件移植进来。

<?php/**
 * Template Name: REST Blog Listing
 * @package WordPress
 * 
 */// Notice that there is no request to get_header();  it is not needed/*
* REST Class from speckyboy
*
*/// check if the class exists already as we don't want it to failif(!class_exists('speckyboyREST')){
	class speckyboyREST{
		// define class variabels
		protected $_callback;
		protected $_count;
		protected $_output;	
		protected $_format;					
	
	// automate everything
	public function __construct(){
            $this->_output = array(); // setup the output as an array, needed for json
            $this->_count = 10; // define the blog count shown as default
            $this->_callback = false;  // set callback to false just incase a jsonp callback request is not made                      
            $this->_format = 'json'; // default to json replies, will be changed if callback used
			if( $this->check_url_vars() ){
				$this->save_url_vars();
			}
			$this->make_the_loop();
			$this->send_output();
        }      
        
        protected function check_url_vars(){
        	if(!empty($_GET)){ // check to see if the GET variables are set at all, this could more specific if wanted. 
        		return true;
        	}else{
        		return false;
        	}
        }
        
        protected function sanatize_vars($var){ // stop nasties by removing them from the possible URL vars
                return strip_tags(html_entity_decode(urldecode($var)));        
        }
        
        protected function save_url_vars(){
                if(isset($_GET['callback']) ){
                        $this->_format = 'jsonp'; // as there is a callback, setting the output to be jsonp
                        $this->_callback = $this->sanatize_vars($_GET['callback']); // defining the output
                }
                if(isset($_GET['count']) ){
                        $this->_count = $this->sanatize_vars($_GET['count']); // could use is_numeric here if wanted
                }

        }
        
        protected function error($type, $errorMessage){
        	$this->_output['status'] = $type; // define the error message value
        	$this->_output['data'] = $errorMessage; // define the error message text
        	$this->_format = 'jsonp'; // setting to jsonp so that we can force a callback to a error handler
        	$this->_callback = 'errorReply';  // will send errors back to errorReply function.
        }
        
        
        protected function make_the_loop(){
        	$query = array(
        	  'post_type' => 'post',        // get only posts	
                  'post_status' => 'publish',   // only published stuff        
                  'posts_per_page'=>$this->_count, // with the page count wanted  count = -1 means everything
        	);
        	$loop = get_transient('restget'.$this->_count); // get the transient of the loop to make things faster
        	if($loop === false){                
                    $loop = new WP_Query($query);  // make loop query
                    set_transient('restget'.$this->_count, $loop, 60 * 60);  // set the transient for the loop for 1 hour
                }
        	$array_out = array();  // setup an array to save the results        	
        	if ($loop->have_posts()) : while ($loop->have_posts()) : $loop->the_post();  // do the loop
                        if(function_exists('has_post_thumbnail') && has_post_thumbnail()){   // check for a post thumnail                      
                          $image =  get_the_post_thumbnail($page->ID, 'thumbnail');  
                        }else{
                            $image = null;  // set image to null is there is not one.
                        }
                        $array_out[] = array(   // add a new array set
                            'title' => get_the_title(), // the title
                            'permalink'  => get_permalink(), // the link back to the main site
                            'excerpt' =>  get_the_excerpt(), // the post excerpt    
                            'image'=> $image                         
                        );           		
                        
        	endwhile; // finsh the loop and then save the data
        	$this->_output['status'] = '200'; // set a good status
                $this->_output['data'] = $array_out; // add the array to the data ready to json encode
        	else:
                $this->error('400','no data returned'); // no data error
            endif;
        }
        
	protected function send_output(){
			$time = time() + 60 * 60;  // setup a 1 hour cache on the output
            $expire = date ( "D, d M Y H:i:s e", $time ); // define the expire time       
            header("Expires: " . $expire );  // set expire header for 1 hour
            header("Content-type: application/json"); // set content type to be json		
            if(function_exists('ob_gzhandler')){  // setup GZIP compression if available
                ob_start('ob_gzhandler'); //start gzipped buffer
            }
            else{ 
                ob_start(); // start output buffer
            }            
            switch($this->_format){
            case 'json':
                echo json_encode($this->_output);  // if json, echo json encoded data to buffer
                break;
            case 'jsonp':
                echo $this->_callback."(".json_encode($this->_output).");";    // if jsonp, echo json encode with callback to buffer            
                break;
            }
            ob_end_flush(); // flush the buffer sendin the output to the client
        }
        
        public function __desctuct(){
        	unset($this); // kill all the things that have been made, clean up behind.
        }

	}}// Start the class on load and get reply$restapi = new speckyboyREST();// notice no request for get_sidebar() or get_footer(); it is not needed as we are not sending HTML, just JSON?>

要使用上述代码,可以将其剪切并粘贴到主题内的页面模板文件中,也可以在这个压缩文件。如果你想看到它在行动,你可以看到它在这里,但请注意,我已经禁用了计数从超过20个帖子的长度。

结束回调

除非您使用服务器与服务器之间的通信来发出JSON数据请求,否则您将需要使用回调变量。为了使它的这一部分正确工作,它又回到了使用JSON点表示法。我们需要做的是使用for循环遍历数据对象的内容,然后创建HTML在屏幕上显示它。

function callbackFunction(data){
	values = data.data;
	var output = '<ul>';
	for (var i = 0; i < values.length; i++) {
		output += "<li style='clear:left'>";
			if( values[i].image != null) { 
				output += "<div style='float:left; margin-right:10px'>"
					output += values[i].image;
				output += "</div>"	
			}
			output += "<h2><a href='"+ values[i].permalink +"'>" + values[i].title + "</a></h2>";
			output += "<p>" + values[i].excerpt + "</p>";
		output += "</li>";		
	}
	output += '</ul>';
	document.getElementById('output').innerHTML = output;}

山西企业网站开发看看你可以看到的代码,我选择使用内联样式,你可能不想这样做,这是因为移动应用程序可能不允许使用CSS文件。如果你想的话可以把这个撕下来。需要注意的另一件重要的事情是使用value[i],这是为了获得循环中的确切对象,[i]表示相关的数据集。

如果您希望看到此代码正在运行,请查看此页。

处理错误

要处理错误,还需要一个名为errorReply()创造

function errorReply(data){
	alert('there has been a problem. ' + data.data);}

我只是在这里采用简单的方法,在弹出警报中显示错误消息。可能要复杂得多。

有什么可以做得更好/有什么不同?

总有一些事情可以做得更好或不同,在你对此过于挑剔之前,请记住,这只是一篇文章,而不是我正在写的一本书。所有这一切,有许多事情可以做得更好或不同。

  • 使用瞬态存储JSON输出,而不仅仅是循环。
  • 可以选择将RESTAPI的输出处理为XML。
  • 可以将其设置为插件,然后扩展类以使其他RESTAPI可用。
  • 可以设置WordPress url重写API以从url收集vars,而不是获取vars。
  • 控件可以设置单独的api子域。

    wp-config.php

    设置不允许该域上的cookie。
  • 客户端可以使用更好的错误处理,也可以在类端使用。例如,我们可以在此基础上读取状态并执行正确的功能。

毫无疑问,你已经想到了一些其他的可能性。无论如何,你可以自由地接受这些代码,并让它为你自己工作。


寒枫总监

来电咨询

18868949445

微信咨询

寒枫总监

TOP