权那他

589 分类: 原创内容

android-typecho编写教程

android-typecho编写教程

基本的编写typecho的android客户端的教程

以下将以Java语言编写,使用XmlRpc远程过程调用

我粗糙的概述,描述性的文字比较少,往后完善

开发工具

  • android studio

然后你需要有一个typecho博客,不过为了方便我使用一个无用的博客作实例

地址:https://pmhcuu.coding.io/

账号:admin

密码:admin

创建项目

打开android studio,并创建一个project,关于怎样创建你可以谷歌一下

Run

创建了hello world,run 一下

导入支持库

由于我们是用的是XmlRpc,故需要使用相关的库

下载 https://library.krait.cn/lib/android-xmlrpc.jar

放在 nabo(项目名)\app\libs中,并在build.gradle(Module:app)dependencies {***}
添加后为

dependencies {
   implementation files('libs/android-xmlrpc.jar')
}

然后build

由于我懒,下面讲的是在一个activity中写

封装一个对象

public class Personage {
        private String url;
        private int id;
        private String name;
        private String password;

        public void setUrl(String url) {
            this.url = url;
        }

        public void setId(int id) {
            this.id = id;
        }

        public void setName(String name) {
            this.name = name;
        }

        public void setPassword(String password) {
            this.password = password;
        }

        public String getUrl() {
            return this.url;
        }

        public int getId() {
            return this.id;
        }

        public String getName() {
            return this.name;
        }

        public String getPassword() {
            return this.password;
        }
    }

实例

实例Personage

personage = new Personage();
personage.setUrl("https://pmhcuu.coding.io/index.php/action/xmlrpc");
personage.setId(1);
personage.setName("admin");
personage.setPassword("admin");
     /**
     * 获取文章
     *
     * @param struct
     * @return
     */
    @Override
    public Object[] getPosts(Map<String, Object> struct) throws Exception {
        Object[] params = new Object[]{
                personage.getId(),
                personage.getName(),
                personage.getPassword(),
                struct
        };
        return (Object[]) client.callEx("metaWeblog.getRecentPosts", params); //metaWeblog.getRecentPosts 可为你需要请求的api
    }

其中的metaWeblog.getRecentPosts 可为你需要请求的api

https://github.com/typecho/typecho/blob/master/var/Widget/XmlRpc.php

第2267行开始

 /** WordPress API */
'wp.getPage'                => array($this, 'wpGetPage'),
'wp.getPages'               => array($this, 'wpGetPages'),
'wp.newPage'                => array($this, 'wpNewPage'),
'wp.deletePage'             => array($this, 'wpDeletePage'),
.....

取左边的,比如wp.newPage

比如获取最新文章的第一个标题

Map<String, Object> struct = new HashMap<>();
Object[] posts = getPosts(struct)

这里将Object[] 的posts 转为HashMap<?, ?>类型,不懂就谷歌一下

HashMap<?, ?>  post = (HashMap<?, ?>) posts[0]; //posts[i] ,posts是一个object数组
String title = String.valueOf(post.get("title"));

好了以上就是我很很很粗糙的讲解了基本的请求

权限

AndroidManifest.xml对于地方加网络权限<uses-permission android:name="android.permission.INTERNET" />

如果你minSdkVersion大于了24,那么android默认对http不能请求

需要加

android:usesCleartextTraffic=“true”

<uses-library
    android:name="org.apache.http.legacy"
    android:required="false" />

整个就是:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="cn.krait.nabo">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        .....
         android:usesCleartextTraffic=“true”
        .....>
        <uses-library
            android:name="org.apache.http.legacy"
            android:required="false" />
        .......
    </application>

</manifest>

封装整合

创建一个名为XMLRPCInterface 的class

package cn.krait.nabo.service;

import java.util.HashMap;
import java.util.Map;
/**
 * @author 权那他(Kraity)
 * @date 2019/7/23.
 * GitHub:https://github.com/kraity
 * WebSite:https://krait.cn
 * email:kraits@qq.com
 */
 public interface XMLRPCInterface {

    /**
     * listMethods
     *
     * @return
     */
    Object[] listMethods(

    ) throws Exception;

    /**
     * 资料
     *
     * @return
     */
    Object[] getUser(

    ) throws Exception;
     
     /**
     * 获取文章
     *
     * @param struct
     * @return
     */
    Object[] getPosts(
            Map<String, Object> struct
    ) throws Exception;
     
     //还有很多,类比
    
}

创建一个名为XMLRPCService 的class

package cn.krait.nabo.service;

import org.xmlrpc.android.XMLRPCClient;

import java.net.URI;
import java.util.HashMap;
import java.util.Map;

import cn.krait.nabo.util.ConstUtils;

/**
 * @author 权那他(Kraity)
 * @date 2019/7/23.
 * GitHub:https://github.com/kraity
 * WebSite:https://krait.cn
 * email:kraits@qq.com
 */
public class XMLRPCService implements XMLRPCInterface {

    private Personage personage;
    private XMLRPCClient client;

    /**
     * init 初始化
     *
     * @param url
     * @param id
     * @param name
     * @param password
     */
    public void init(String url, int id, String name, String password) {
        personage = new Personage();
        personage.setUrl(url);
        personage.setId(id);
        personage.setName(name);
        personage.setPassword(password);

        client = new XMLRPCClient(
                URI.create(
                        personage.getUrl()
                )
        );
    }

    public class Personage {
        private String url;
        private int id;
        private String name;
        private String password;

        public void setUrl(String url) {
            this.url = url;
        }

        public void setId(int id) {
            this.id = id;
        }

        public void setName(String name) {
            this.name = name;
        }

        public void setPassword(String password) {
            this.password = password;
        }

        public String getUrl() {
            return this.url;
        }

        public int getId() {
            return this.id;
        }

        public String getName() {
            return this.name;
        }

        public String getPassword() {
            return this.password;
        }
    }

    /**
     * listMethods
     *
     * @return
     */
    @Override
    public Object[] listMethods() throws Exception {
        return (Object[]) client.callEx(ConstUtils.API_listMethods, new Object[0]);
    }

    /**
     * 获取博主资料
     *
     * @return
     */
    @Override
    public Object[] getUser() throws Exception {
        Object[] params = new Object[]{
                personage.getId(),
                personage.getName(),
                personage.getPassword()
        };
        return (Object[]) client.callEx(ConstUtils.API_getUser, params);
    }
    
    /**
     * 获取文章
     *
     * @param struct
     * @return
     */
    @Override
    public Object[] getPosts(Map<String, Object> struct) throws Exception {
        Object[] params = new Object[]{
                personage.getId(),
                personage.getName(),
                personage.getPassword(),
                struct
        };
        return (Object[]) client.callEx(ConstUtils.API_getRecentPosts, params);
    }
    
    //还有很多,类比
    
}

创建一个名为ConstUtils 的class

/**
 * @author 权那他(Kraity)
 * @date 2019/8/13.
 * GitHub:https://github.com/kraity
 * WebSite:https://krait.cn
 * email:kraits@qq.com
 */
public class ConstUtils {

    private ConstUtils() {
        throw new UnsupportedOperationException("u can't instantiate me...");
    }

    public static final String API_listMethods = "system.listMethods";
    public static final String API_getUser = "typecho.getUser";
    public static final String API_newPost = "typecho.newPost";
    public static final String API_getRecentPosts = "typecho.getPosts";
    //还有很多,类比
}

MainActivity.class

protected XMLRPCService XMLRPCService;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    /*实例化 XMLRPCService 接口*/
    XMLRPCService = new XMLRPCService();
    XMLRPCService.init(
        "https://pmhcuu.coding.io/index.php/action/xmlrpc",
        1,
        "admin",
        "admin"
    );
    
    //例如获取文章
    new onRefreshAsyncTask().execute();
}

    @SuppressLint("StaticFieldLeak")
    class onRefreshAsyncTask extends AsyncTask<Object, Void, Object[]> {

        /**
         * 后台耗时操作,存在于子线程中
         *
         * @param params
         * @return
         */
        @Override
        protected Object[] doInBackground(Object[] params) {

            try {
                Map<String, Object> struct = new HashMap<>();
                return XMLRPCService.getPosts(struct);

            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }

        /**
         * 耗时方法结束后执行该方法,主线程中
         *
         * @param result
         */
        @Override
        protected void onPostExecute(Object[] result) {
            Object[] posts = result;//这里得到了post
            //然后就是处理
        }
    }

好了,我就写到这里,有错的地方请大家指出。

我知道我描述不清楚,待以后慢慢修改,毕竟我现在在复读~

#typecho客户端, typecho, android

作者: 权那他

版权: 除特别声明,均采用BY-NC-SA 4.0许可协议,转载请表明出处

目录Content

已有 7 条评论

  1. 1 1

    大佬,写个python版的吧~

    1. 😂,但是我还没有开始学Python,网上有人用Python写过的,你可以仿照一下。😁

      1. 1 1

        有吗?能给份自尿吗,感谢

  2. rolin rolin

    在用,在看,最近闲

    1. 我出错的地方,还请多指教😁

  3. WJG WJG

    学Flutter吧,Java写起来好麻烦~

    1. 哈哈😃。用java习惯了,习惯了这样的语法😂

评论