2017-09-06 4 views
1

GitLabサーバーにGETリクエストをスクリプトしてファイルを取得するためにGroovyを使用しようとしています。 API URI形式は次のとおりです。GETリクエストのURIで '/'をエスケープするにはどうすればよいですか?

https://githost/api/v4/projects/<namespace>%2F<repo>/files/<path>?ref=<branch> 

名前空間とリポジトリの間にエンコードされた '/'があることに注意してください。最後のURIが正しく動作するには、以下のように見える必要があります:

https://githost/api/v4/projects/mynamespace%2Fmyrepo/files/myfile.json?ref=master

私は次のコードを持っている:

File f = HttpBuilder.configure { 
    request.uri.scheme = scheme 
    request.uri.host = host 
    request.uri.path = "/api/v4/projects/${apiNamespace}%2F${apiRepoName}/repository/files/${path}/myfile.json" 
    request.uri.query.put("ref", "master") 
    request.contentType = 'application/json' 
    request.accept = 'application/json' 
    request.headers['PRIVATE-TOKEN'] = apiToken 
    ignoreSslIssues execution 
}.get { 
    Download.toFile(delegate as HttpConfig, new File("${dest}/myfile.json")) 
} 

ただし、%2Fは%として再符号化されたが252F。私は名前空間とリポジトリの間に%2FをエンコードしないようにURIを作成しようとする試みを複数試みましたが、何もできません。 '%'を再エンコードするか、それをリテラル「/」にデコードします。

「/」をエンコードしたままにする方法でURIを設定するには、Groovy + http-builder-ngを使用してこれを行うにはどうすればよいですか?私は検索しましたが、うまくいかない例は見つかりませんでした。

ありがとうございます!

+0

'$ {apiNamespace}/$ {apiRepoName}'として使用できますか?私はエンコードされた値の代わりに '/'を使うことを意味しますか? – Rao

+0

パス "/ api/v4/projects/REPO_ID/repository/files/..."では、REPO_IDは名前空間とリポジトリ名の組み合わせで、スラッシュで区切られています。しかし、スラッシュはパス区切りとして解釈されないようにエンコードされなければなりません。 残念ながら、それは直接使用することはできません。それ以外の場合は、別々のパス要素であり、APIはそれを認識しません。 –

+0

これは、プロジェクトが 'URI'オブジェクトを構築/使用する際の問題です。回避策がないようです - 私はバグ修正に取り組んでいます。 – cjstehno

答えて

0

可能な回避策

GitlabのAPIを使用すると、プロジェクトIDまたはプロジェクト名を経由して照会することができます。まずプロジェクトIDを調べて、プロジェクトに問い合わせます。

  1. まず、プロジェクトIDを調べます。参照してくださいhttps://docs.gitlab.com/ee/api/projects.html#list-all-projects

    デフ・プロジェクト= // GET /プロジェクト

    DEFプロジェクト= projects.find {それ[ 'path_with_namespace'] == 'ディアスポラ/ディアスポラ・クライアント'}

  2. プロジェクトにより取得: ID、https://docs.gitlab.com/ee/api/projects.html#get-single-project

    GETの/projects/${project.id}あなたがENCOとの要求を処理することができます1.0.0リリースの

1

を参照してください。 URIの空白文字。例は次のようになります。

def result = HttpBuilder.configure { 
    request.raw = "http://localhost:8080/projects/myteam%2Fmyrepo/myfile.json" 
}.get() 

お知らせ、例のrawの使用ではなく、uri。この方法を使用するには、Uriの他のエンコード/デコードを自分で行う必要があります。

+0

ありがとう、これは私を助けました – ndueck

関連する問題