Java语言SpringCloud调用harbor的接口实现镜像删除
使用用java SpringCloud调用harbor的接口,实现删除时候,发现有报错问题。
通过界面使用curl测试ok,如下:
curl -X 'DELETE' \ 'http://172.17.64.145:8008/api/v2.0/projects/xw-image/repositories/alpine' \ -H 'accept: application/json' \ -H 'authorization: Basic YWRtaW46SGFyYm9yMTIzNDU=' \ -H 'X-Harbor-CSRF-Token: hxAWWQUC14J7BNJRY6AXVse6BZdEf9HXF5rSCCxvbR11fQGn/hy2fxacVU7y8YFvqbmDDWGetIOCOPOCDnV3Dw=='
经过使用postman测试后发现,如果不带X-Harbor-CSRF-Token的话,则会报错:
{ "errors": [ { "code": "FORBIDDEN", "message": "CSRF token invalid" } ] }

del的接口:/projects/{project_name}/repositories/{repository_name}/artifacts/{reference}
在开发过程中,发现单纯调用del删除接口,直接出现403的状态问题,就发现了想要调用Harbor的接口,必须实现登录,验证。
在参考了其他的相关博客后(ptyhon解析的办法),下面给出一个demo案例:
harbor通过API删除镜像:https://www.cnblogs.com/sharkchili/p/15632413.html
package cn.piesat.monitor.utils; import org.apache.http.Header; import org.apache.http.HttpResponse; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import java.util.ArrayList; import java.util.HashMap; import java.util.List; public class HarborUtils { public static void main(String[] args) throws Exception { DefaultHttpClient httpclient = new DefaultHttpClient(); //初次登录请求的URL------------------------------------------------------- HttpGet get = new HttpGet("http://xxx.xxx.xxx.xxx:端口/c/login"); // 登录url //创建登录时候所需要传递的数据 HttpResponse response; String value = null; response = httpclient.execute(get); HashMap<String, String> data = new HashMap<>(); //获取response中的cookie值 String Cookie = null; Header[] headers = response.getHeaders("set-Cookie"); for (int i = 0; i < headers.length; i++) {//取出所有的cookie值 value = headers[i].getValue(); String s = value.split(";")[0]; String[] split = s.split("="); data.put(split[0], split[1]); } // System.out.println("_gorilla_csrf:"+data.get("_gorilla_csrf")); // System.out.println("sid:"+data.get("sid")); Header[] headers1 = response.getHeaders("X-Harbor-Csrf-Token"); String token = null; for (int i = 0; i < headers1.length; i++) { token = headers1[i].getValue(); } StringBuffer append = new StringBuffer("_gorilla_csrf=").append(data.get("_gorilla_csrf")).append(";").append("sid=").append(data.get("sid")); Cookie = append.toString(); //System.out.println("X-Harbor-Csrf-Token:"+data.get("X-Harbor-Csrf-Token")); //===================================================================== // 第二次登录请求 HttpPost post = new HttpPost("http://xxx.xxx.xxx.xxx:端口/c/login"); List<BasicNameValuePair> nvp = new ArrayList<>(); //此处的key值对应你在浏览器上获取的 nvp.add(new BasicNameValuePair("principal", "admin")); nvp.add(new BasicNameValuePair("password", "Harbor12345")); String sCharSet = "utf-8"; post.setEntity(new UrlEncodedFormEntity(nvp, sCharSet)); post.setHeader("Cookie", Cookie); post.setHeader("X-Harbor-CSRF-Token", token); DefaultHttpClient httpclient1 = new DefaultHttpClient(); HttpResponse response2 = httpclient1.execute(post); System.out.println(response2.getStatusLine().getStatusCode()); String str2 = EntityUtils.toString(response2.getEntity()); // 这里就是我们要的数据了。 System.out.println(response2.getStatusLine());//登录成功的状态200 if (!response2.getStatusLine().equals("200")) { System.out.println("登录失败"); } String sid = null; Header[] headers2 = response2.getHeaders("set-Cookie"); for (Header header : headers2) {//将登录后sid将原map里面进行替换 sid = header.getValue().split(";")[0].split("=")[1]; System.out.println(sid); data.put("sid", sid); } //---------------------------------------------------------------------------------- // 第三次删除请求 HttpDelete del = new HttpDelete("http://xxx.xxx.xxx.xxx:端口/api/v2.0/projects/test/repositories/111/artifacts/sha256:0d2cd896f7abf634d769d062beac5a49290567a2e54043489b6cc37fd463d004"); StringBuffer append1 = new StringBuffer("_gorilla_csrf=").append(data.get("_gorilla_csrf")).append(";").append("sid=").append(data.get("sid")); Cookie = append1.toString(); del.setHeader("Cookie", Cookie); del.setHeader("X-Harbor-CSRF-Token", token); DefaultHttpClient httpclient2 = new DefaultHttpClient(); CloseableHttpResponse execute = httpclient2.execute(del); System.out.println(execute.getStatusLine()); } }
第一次get空请求,是为了获得其Cookie,以及token,从而在第二次登录请求中,将这些参数放到请求体中,实现登录,然后再进行第三次删除请求时,进行删除。
总结:想实现调用harbor的接口,就必须实现登录,而实现登录,又需要建立第一次请求。
赠人玫瑰
手留余香
我们曾如此渴望命运的波澜,到最后才发现:人生最曼妙的风景,竟是内心的淡定与从容……我们曾如此期盼外界的认可,到最后才知道:世界是自己的,与他人毫无关系!-杨绛先生
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【关注我】。

浙公网安备 33010602011771号