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的接口,就必须实现登录,而实现登录,又需要建立第一次请求。

 

posted @ 2024-11-19 17:46  念槐聚  阅读(54)  评论(0)    收藏  举报