如果你还没有启动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 ,手动添加任务后点击对应的请求查看它的请求格式。
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());