인터넷 찾아가며 이것저것 짜집기도 하고 영 별거 아닌걸로 고생아닌고생하니까 짜증이 나네요...
그래서 제가 짠거 공개할게요.
springdml restTemplate 이용해서 했고요..
인터넷 찾아보니, 이게 뭐 convert가 좀 문제라서...
한글이 마구 깨지는데..
이거 구글링 열심히해서 어떤분 소스 베껴다가 넣었어요.
원본 주소 : https://gist.github.com/ucpwang/949145408a12bb40a671
주석같은거 안달려 있으니 알아서 보시면 될거 같고요.
contents에서 img태그 찾아서 #n 으로 치환해서 멀티파트로 파일 넘기는것까지 구현했습니다.
error코드 인증실패 리턴시에는 토큰값 갱신 하시는 로직 따로 작성하시면 되어요.
public String blogPost(String token, String title, String contents) {
contents = contents.replaceAll("<br>", "");
contents = contents.replaceAll("<BR>", "");
List<String> imageSrcs = new ArrayList<>();
List<Resource> resources = new ArrayList<>();
int startIdx = 0;
int imgIdx = contents.indexOf("<img", startIdx);
while(imgIdx > -1){
int srcIdx = contents.indexOf("//image", imgIdx);
int endIdx = contents.indexOf("\"", srcIdx);
String imgSrc = contents.substring(srcIdx, endIdx);
imageSrcs.add(imgSrc);
startIdx = endIdx;
imgIdx = contents.indexOf("<img", startIdx);
}
int idx = 0;
for(String imageSrc : imageSrcs){
contents = contents.replace(imageSrc, "#"+idx);
idx++;
int qIdx = imageSrc.indexOf("?");
if(qIdx < 0){
qIdx = imageSrc.length();
}
imageSrc = imageSrc.substring(0, qIdx);
String fileSrc = imageSrc.replace(imageServerHost, saveDirectory);
Resource file = new FileSystemResource(fileSrc);
resources.add(file);
}
String header = "Bearer " + token; // Bearer 다음에 공백 추가
RestTemplate restTemplate = new RestTemplate();
String apiURL = "https://openapi.naver.com/blog/writePost.json";
try {
for (HttpMessageConverter<?> hmc : restTemplate.getMessageConverters()) {
if (hmc instanceof AllEncompassingFormHttpMessageConverter) {
/** AllEncompassingFormHttpMessageConverter 생성자 내용 일부 가져와서 수정 **/
List<HttpMessageConverter<?>> partConverterList = new ArrayList<HttpMessageConverter<?>>();
partConverterList.add(new ByteArrayHttpMessageConverter());
StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
stringHttpMessageConverter.setWriteAcceptCharset(false);
partConverterList.add(stringHttpMessageConverter);
partConverterList.add(new ResourceHttpMessageConverter());
partConverterList.add(new SourceHttpMessageConverter());
if (ClassUtils.isPresent("javax.xml.bind.Binder", AllEncompassingFormHttpMessageConverter.class.getClassLoader())) {
partConverterList.add(new Jaxb2RootElementHttpMessageConverter());
}
if (ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", AllEncompassingFormHttpMessageConverter.class.getClassLoader())
&& ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", AllEncompassingFormHttpMessageConverter.class.getClassLoader())) {
partConverterList.add(new MappingJackson2HttpMessageConverter());
}
else if (ClassUtils.isPresent("org.codehaus.jackson.map.ObjectMapper", AllEncompassingFormHttpMessageConverter.class.getClassLoader())
&& ClassUtils.isPresent("org.codehaus.jackson.JsonGenerator", AllEncompassingFormHttpMessageConverter.class.getClassLoader())) {
partConverterList.add(new MappingJackson2HttpMessageConverter());
}
((AllEncompassingFormHttpMessageConverter) hmc).setPartConverters(partConverterList);
}
}
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", header);
MultiValueMap<String, Object> parameters = new LinkedMultiValueMap<String, Object>();
parameters.add("title", title);
parameters.add("contents", contents);
for(Resource resource : resources){
parameters.add("image", resource);
}
HttpEntity<?> httpEntity = new HttpEntity<>(parameters,headers);
ResponseEntity<HashMap> re = restTemplate.exchange(apiURL, HttpMethod.POST, httpEntity, HashMap.class);
System.out.println(re);
return (String) re.getBody().get("error_code");
} catch (Exception e) {
System.out.println(e);
}
return null;
}