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

如果你还没有启动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.png",
            //referer 用来绕开部分防盗链机制 星号表示使用url作为referer
            "referer": "*"
        }
    ]
}

返回格式

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

如果不想看全英文的官方文档,也可以用 ariaNg 插件,打开 F12 - network ,手动添加任务后点击对应的请求查看它的请求格式。
ariaNg

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 lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHeaders;
import org.apache.http.HttpStatus;
import org.apache.http.ParseException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.HttpHostConnectException;
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.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * Aria2请求的Json对象
 *
 * @author bx002
 * @date 2020/11/27 17:20
 */
//lombok注解  提供所有getter setter方法
@Data
//开启setter方法的链式调用
@Accessors(chain = true)
//无参构造方法
@NoArgsConstructor
@Slf4j
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";
    public final static String METHOD_TELL_STOPPED = "aria2.tellStopped";
    public final static String METHOD_TELL_WAITING = "aria2.tellWaiting";
    public final static String METHOD_REMOVE_DOWNLOAD_RESULT = "aria2.removeDownloadResult";
    private final static String[] PARAM_ARRAY_OF_FILED =
            new String[]{
    
    "totalLength", "completedLength", "files", "status", "errorCode", "gid"};
    /**
     * id随机生成,也可以手动设置
     */
    private String id = UUID.randomUUID().toString();
    private String jsonrpc = "2.0";
    private String method = METHOD_TELL_ACTIVE;
    private String url;
    private List<Object> params = new ArrayList<>();
    //暂存下载参数

    /**
     * 添加下载参数
     * @return
     */
    public Aria2Json addParam(Object obj) {
    
    
        params.add(obj);
        return this;
    }

    public static String tellActive() {
    
    
        Aria2Json aria2Json = new Aria2Json();
        aria2Json.setMethod(METHOD_TELL_ACTIVE)
                .addParam(PARAM_ARRAY_OF_FILED);
        return aria2Json.send(null);
    }

    public static String tellStopped() {
    
    
        Aria2Json aria2Json = new Aria2Json();
        aria2Json.setMethod(METHOD_TELL_STOPPED)
                .addParam(-1)
                .addParam(1000)
                .addParam(PARAM_ARRAY_OF_FILED);
        return aria2Json.send(null);
    }

    public static String tellWaiting() {
    
    
        Aria2Json aria2Json = new Aria2Json();
        aria2Json.setMethod(METHOD_TELL_WAITING)
                .addParam(0)
                .addParam(1000)
                .addParam(PARAM_ARRAY_OF_FILED);
        return aria2Json.send(null);
    }

    public static String removeDownloadResult(String gid) {
    
    
        Aria2Json aria2Json = new Aria2Json();
        aria2Json.setMethod(METHOD_REMOVE_DOWNLOAD_RESULT)
                .addParam(gid);
        return aria2Json.send(null);
    }

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

    public String send(String jsonRpcUrl) {
    
    
        //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;
        try {
    
    
            response = HttpClients.createDefault().execute(httpPost);
        } catch (HttpHostConnectException e) {
    
    
            log.debug("Aria2 无法连接");
            return null;
        } catch (IOException e) {
    
    
            e.printStackTrace();
            return null;
        }
        //返回的状态码
        int statusCode = response.getStatusLine().getStatusCode();
        HttpEntity entity = response.getEntity();
        //请求结果字符串
        String result = null;
        try {
    
    
            //用UTF-8解码返回字符串
            result = EntityUtils.toString(entity, StandardCharsets.UTF_8);
            //如果状态码为200表示请求成功,返回结果
            if (statusCode == HttpStatus.SC_OK) {
    
    
                EntityUtils.consume(entity);
                return result;
            }
        } catch (IOException | ParseException e) {
    
    
            e.printStackTrace();
        }
        //请求失败 打印状态码和提示信息 返回null
        System.out.println("statusCode = " + statusCode);
        System.out.println("result = " + result);
        return null;
    }
}

调用

由于添加下载需要一个对象作为下载参数,定义一个option类

@Data
@Accessors(chain = true)
public class Aria2Option {
    
    
    String dir;
    String out;
    String referer;

}

调用时先设置option 再把option放入对象中

		Aria2Option aria2Option = new Aria2Option();
        aria2Option.setDir(dir)
                .setOut(filName)
                .setReferer("*")
        ;
        String url = "https://***.***.***/aaa.png";
        Aria2Json aria2Json = new Aria2Json(downloadingFile.getId());
        aria2Json.setMethod(Aria2Json.METHOD_ADD_URI)
                .addParam(new String[]{
    
    url})
                .addParam(aria2Option);
        ;
        String send = aria2Json.send(null);

其他静态调用

Aria2Json.tellActive();
Aria2Json.tellWaiting();
Aria2Json.tellStopped();
Aria2Json.removeDownloadResult(f.getGid());

猜你喜欢

转载自blog.csdn.net/hjg719/article/details/110262913