欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Aria2 RPC接口协议和Java的本地调用实现

程序员文章站 2022-07-10 09:18:23
如果你还没有启动Aira2 : 安装和配置目录Aira2 RPC接口协议Java实现依赖核心类调用Aira2 RPC接口协议官方文档方法列表下载参数本文中我们使用默认的本地调用,我们需要用POST方法向该地址发送Json格式的请求http://localhost:6800/jsonrpc详情请参考上方的官方文档,只以一个简单例子进行说明{//消息id,aira2会原样返回这个id,可以自动生成也可以用其他唯一标识 "id":"dsfasdf", //固定值...

如果你还没有启动aria2 : 安装和配置

Aria2 RPC接口协议

本文中我们使用默认的本地调用,我们需要用POST方法向该地址发送Json格式的请求

http://localhost:6800/jsonrpc

详情请参考上方的官方文档,只以一个简单例子进行说明

{
	//消息id,aria2会原样返回这个id,可以自动生成也可以用其他唯一标识
    "id":"dsfasdf",
    //固定值
    "jsonrpc": "2.0",
    //方法名,具体参考上方“方法列表”链接,本例中为“添加下载任务”
    "method": "aria2.addUri",
    //params为数组
    "params":[
    	//第一个成员也为一个数组,它内容为需下载文件的url,如果有多个来源可以写多个
        [
            "https://***.***.***/*****.png"
        ],
        //第二个成员为对象,成员为下载参数,详情参考上方“下载参数”链接
        {
        	//下载根目录
            "dir":"E:/download/",
            //根目录下的子目录名称
            "out":"test1",
            //referer 用来绕开部分防盗链机制 星号表示使用url作为referer
            "referer": "*"
        }
    ]
}

返回格式

{
	//上方传入的消息id
    "id": "dsfasdf",
    "jsonrpc": "2.0",
    //任务的唯一标识
    "result": "588e449a86cb56f3"
}

如果不想看全英文的官方文档,也可以用 ariaNg 插件,打开 F12 - network ,手动添加任务后点击对应的请求查看它的请求格式。
Aria2 RPC接口协议和Java的本地调用实现

Java实现

依赖

		<!--lombok插件 不使用的话需要自己写getter setter方法-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>    
        <!--发送http请求-->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpmime</artifactId>
            <version>4.5.3</version>
        </dependency>
        <!--json解析-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>

核心类

根据协议规定的对象结构定义对象类

import com.alibaba.fastjson.JSONObject;
import com.gin.pixivmanager2.util.JsonUtil;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHeaders;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.util.StringUtils;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.*;

/**
 * aria2请求的Json对象
 *
 * @author bx002
 * @date 2020/11/27 17:20
 */
//lombok注解  提供所有getter setter方法
@Data
//开启setter方法的链式调用
@Accessors(chain = true)
//无参构造方法
@NoArgsConstructor
public class aria2Json {
    /**
     * 方法名常量
     */
    public final static String METHOD_TELL_ACTIVE = "aria2.tellActive";
    public final static String METHOD_ADD_URI = "aria2.addUri";
    public final static String METHOD_GET_GLOBAL_STAT = "aria2.getGlobalStat";
    /**
     * id随机生成,也可以手动设置
     */
    private String id = UUID.randomUUID().toString();
    private String jsonrpc = "2.0";
    private String method = METHOD_TELL_ACTIVE;
    private String url;
    //暂存下载参数
    private Map<String, Object> paramsMap = new HashMap<>();

    /**
     * 添加下载参数
     *
     * @param key
     * @param value
     * @return
     */
    public aria2Json addParam(String key, String value) {
        paramsMap.put(key, value);
        return this;
    }

    /**
     * 设置referer
     *
     * @param referer
     * @return
     */
    public aria2Json setReferer(String referer) {
        return addParam("referer", referer);
    }

    /**
     * 设置origin
     *
     * @param origin
     * @return
     */
    public aria2Json setOrigin(String origin) {
        return addHeader("Origin", origin);
    }

    /**
     * 设置下载根目录
     *
     * @param dir
     * @return
     */
    public aria2Json setDir(String dir) {
        return addParam("dir", dir);
    }

    /**
     * 设置根目录下的子目录名称
     *
     * @param fileName
     * @return
     */
    public aria2Json setOutName(String fileName) {
        return addParam("out", fileName);
    }

    /**
     * 获取header列表
     *
     * @return
     */
    public List<String> findHeaders() {
        List<String> header = (List<String>) paramsMap.get("header");
        if (header == null) {
            header = new ArrayList<>();
            paramsMap.put("header", header);
        }
        return header;
    }

    /**
     * 添加header
     *
     * @param key
     * @param value
     */
    public aria2Json addHeader(String key, String value) {
        findHeaders().add(key + ": " + value);
        return this;
    }

    /**
     * 生成真正的params字段
     *
     * @return
     */
    public List<Object> getParams() {
        ArrayList<Object> list = new ArrayList<>();
        //第一个成员为 url
        list.add(new ArrayList<>(Collections.singletonList(url)));
        //第二个成员为下载参数
        list.add(paramsMap);
        return list;
    }

    public aria2Json(String id) {
        this.id = id;
    }

    public String send(String jsonRpcUrl) throws IOException {
        JsonUtil.printJson(this);

        //rpcurl 默认为本地默认地址
        jsonRpcUrl = StringUtils.isEmpty(jsonRpcUrl) ? "http://localhost:6800/jsonrpc" : jsonRpcUrl;
        //创建post请求对象
        HttpPost httpPost = new HttpPost(jsonRpcUrl);
        //设置content type(正文类型) 为json格式
        httpPost.setHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.toString());
        //将 this 对象解析为 json字符串 并用UTF-8编码(重要)将其设置为 entity (正文) 
        httpPost.setEntity(new StringEntity(JSONObject.toJSONString(this), StandardCharsets.UTF_8));
        //发送请求并获取返回对象
        CloseableHttpResponse response = HttpClients.createDefault().execute(httpPost);
        //返回的状态码
        int statusCode = response.getStatusLine().getStatusCode();
        HttpEntity entity = response.getEntity();
        //请求结果字符串
        String result = EntityUtils.toString(entity);
        //如果状态码为200表示请求成功,返回结果
        if (statusCode == HttpStatus.SC_OK) {
            EntityUtils.consume(entity);
            return result;
        }
        //请求失败 打印状态码和提示信息 返回null
        System.out.println("statusCode = " + statusCode);
        System.out.println("result = " + result);
        return null;
    }
}

调用

        String url = "https://***.***.***/aaa.png";
        aria2Json aria2Json = new aria2Json();
        String result = aria2Json
                .setUrl(url)
                .setMethod(aria2Json.METHOD_ADD_URI)
                .setDir("E:/download/test/")
                .setOutPath("test2")
                .addParam("referer", "*")
                .send(null);
        System.out.println("result = " + result);

本文地址:https://blog.csdn.net/hjg719/article/details/110262913

相关标签: json java spring