88 lines
3.7 KiB
Java

package edu.whut.smilepicturebackend.api.aliyunai;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONUtil;
import edu.whut.smilepicturebackend.api.aliyunai.model.CreateOutPaintingTaskRequest;
import edu.whut.smilepicturebackend.api.aliyunai.model.CreateOutPaintingTaskResponse;
import edu.whut.smilepicturebackend.api.aliyunai.model.GetOutPaintingTaskResponse;
import edu.whut.smilepicturebackend.exception.BusinessException;
import edu.whut.smilepicturebackend.exception.ErrorCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class AliYunAiApi {
// 读取配置文件
@Value("${smile-picture.aliyun.apiKey}")
private String apiKey;
// 创建任务地址
public static final String CREATE_OUT_PAINTING_TASK_URL = "https://dashscope.aliyuncs.com/api/v1/services/aigc/image2image/out-painting";
// 查询任务状态
public static final String GET_OUT_PAINTING_TASK_URL = "https://dashscope.aliyuncs.com/api/v1/tasks/%s";
/**
* 创建任务
*
* @param createOutPaintingTaskRequest
* @return
*/
public CreateOutPaintingTaskResponse createOutPaintingTask(CreateOutPaintingTaskRequest createOutPaintingTaskRequest) {
if (createOutPaintingTaskRequest == null) {
throw new BusinessException(ErrorCode.OPERATION_ERROR, "扩图参数为空");
}
// 发送请求
HttpRequest httpRequest = HttpRequest.post(CREATE_OUT_PAINTING_TASK_URL)
.header("Authorization", "Bearer " + apiKey)
// 必须开启异步处理 enable
.header("X-DashScope-Async", "enable")
.header("Content-Type", "application/json")
.body(JSONUtil.toJsonStr(createOutPaintingTaskRequest));
// 处理响应
//这段代码会在 try 块结束时(正常返回或抛出异常)自动调用 httpResponse.close(),从而释放所有底层资源
try (HttpResponse httpResponse = httpRequest.execute()) {
if (!httpResponse.isOk()) {
log.error("请求异常:{}", httpResponse.body());
throw new BusinessException(ErrorCode.OPERATION_ERROR, "AI 扩图失败");
}
CreateOutPaintingTaskResponse createOutPaintingTaskResponse = JSONUtil.toBean(httpResponse.body(), CreateOutPaintingTaskResponse.class);
if (createOutPaintingTaskResponse.getCode() != null) {
String errorMessage = createOutPaintingTaskResponse.getMessage();
log.error("请求异常:{}", errorMessage);
throw new BusinessException(ErrorCode.OPERATION_ERROR, "AI 扩图失败," + errorMessage);
}
return createOutPaintingTaskResponse;
}
}
/**
* 查询创建的任务结果
*
* @param taskId
* @return
*/
public GetOutPaintingTaskResponse getOutPaintingTask(String taskId) {
if (StrUtil.isBlank(taskId)) {
throw new BusinessException(ErrorCode.OPERATION_ERROR, "任务 ID 不能为空");
}
// 处理响应
String url = String.format(GET_OUT_PAINTING_TASK_URL, taskId);
try (HttpResponse httpResponse = HttpRequest.get(url)
.header("Authorization", "Bearer " + apiKey)
.execute()) {
if (!httpResponse.isOk()) {
log.error("请求异常:{}", httpResponse.body());
throw new BusinessException(ErrorCode.OPERATION_ERROR, "获取任务结果失败");
}
return JSONUtil.toBean(httpResponse.body(), GetOutPaintingTaskResponse.class);
}
}
}