in spring-ai-alibaba-graph/spring-ai-alibaba-graph-core/src/main/java/com/alibaba/cloud/ai/graph/node/HttpNode.java [154:233]
private void initBody(HttpRequestNodeBody body, WebClient.RequestBodySpec requestSpec, OverAllState state)
throws HttpNodeException {
switch (body.getType()) {
case NONE:
break;
case RAW_TEXT:
if (body.getData().size() != 1) {
throw new HttpNodeException("RAW_TEXT body must contain exactly one item");
}
String rawText = replaceVariables(body.getData().get(0).getValue(), state);
requestSpec.headers(h -> h.setContentType(MediaType.TEXT_PLAIN));
requestSpec.bodyValue(rawText);
break;
case JSON:
if (body.getData().size() != 1) {
throw new HttpNodeException("JSON body must contain exactly one item");
}
String jsonTemplate = replaceVariables(body.getData().get(0).getValue(), state);
Gson gson = new GsonBuilder().setLenient().create();
Object jsonObject;
try {
jsonObject = gson.fromJson(jsonTemplate, Object.class);
}
catch (JsonSyntaxException e) {
throw new HttpNodeException("Failed to parse JSON body: " + e.getMessage());
}
requestSpec.headers(h -> h.setContentType(MediaType.APPLICATION_JSON));
requestSpec.bodyValue(jsonObject);
break;
case X_WWW_FORM_URLENCODED:
MultiValueMap<String, String> form = new LinkedMultiValueMap<>();
for (BodyData item : body.getData()) {
String key = replaceVariables(item.getKey(), state);
String value = replaceVariables(item.getValue(), state);
form.add(key, value);
}
requestSpec.headers(h -> h.setContentType(MediaType.APPLICATION_FORM_URLENCODED));
requestSpec.body(BodyInserters.fromFormData(form));
break;
case FORM_DATA:
MultiValueMap<String, Object> multipart = new LinkedMultiValueMap<>();
for (BodyData item : body.getData()) {
String key = replaceVariables(item.getKey(), state);
if (item.getType() == BodyType.BINARY) {
ByteArrayResource resource = new ByteArrayResource(item.getFileBytes()) {
@Override
public String getFilename() {
return item.getFilename();
}
};
multipart.add(key, resource);
}
else {
String value = replaceVariables(item.getValue(), state);
multipart.add(key, value);
}
}
requestSpec.headers(h -> h.setContentType(MediaType.MULTIPART_FORM_DATA));
requestSpec.body(BodyInserters.fromMultipartData(multipart));
break;
case BINARY:
if (body.getData().size() != 1) {
throw new HttpNodeException("BINARY body must contain exactly one item");
}
BodyData fileItem = body.getData().get(0);
ByteArrayResource resource = new ByteArrayResource(fileItem.getFileBytes()) {
@Override
public String getFilename() {
return fileItem.getFilename();
}
};
MediaType mediaType = StringUtils.hasText(fileItem.getMimeType())
? MediaType.parseMediaType(fileItem.getMimeType()) : MediaType.APPLICATION_OCTET_STREAM;
requestSpec.headers(h -> h.setContentType(mediaType));
requestSpec.body(BodyInserters.fromResource(resource));
break;
default:
throw new HttpNodeException("Unsupported body type: " + body.getType());
}
}