簡體   English   中英

代表java中的curl命令

[英]representing curl command in java

以下curl命令的Java等效項是什么:

curl -u <username>:<password> -F "access=@svnaccess.txt" https://svn.xxx-xxx.de/upload.cgi

我嘗試通過將.txt文件上傳到此url來更新svn存儲庫的訪問規則。

任何幫助深表感謝!

從curl命令,您正在使用

  • -u使用提供的用戶名和密碼進行基本身份驗證
  • -F使用http動詞post
  • @加載文件內容

Java等效項是使用HttpClient 但是,大多數示例在當前版本中已過時。 因此截至4.4.1 ...

身份驗證簡化了使用CredentialsProvider構建HttpClients的情況

CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(
    new AuthScope(server, (https ? 443:80)),
    new UsernamePasswordCredentials("username", "password")
);
CloseableHttpClient httpclient = HttpClients
    .custom()
    .setDefaultCredentialsProvider(credsProvider)
    .build();

要重現-F來上傳文件的用法,您需要添加實現org.apache.http.NameValuePair ,然后可以對要上傳的文件使用UrlEncodedFormEntity。

List<NameValuePair> formparams = new ArrayList<NameValuePair>();

formparams.add(new FileNameValuePair("access", new File("./svnaccess.txt")));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, Consts.UTF_8);
httppost.setEntity(entity)

可運行的例子

范例.java

import java.io.*;
import java.net.*;
import java.util.*;

import org.apache.http.*;
import org.apache.http.auth.*;
import org.apache.http.client.*;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.*;
import org.apache.http.client.utils.*;
import org.apache.http.impl.client.*;


public class Example {

    public static void main(String[] args) throws Exception {
        String server = "svn.xxx-xxx.de";
        String path = "/upload.cgi";
        Boolean https = true;

        curl(server, path, https);
    }

    private static void curl(String server, String path, Boolean https)
            throws URISyntaxException, IOException, ClientProtocolException {
        CredentialsProvider credsProvider = new BasicCredentialsProvider();
        credsProvider.setCredentials(
            new AuthScope(server, (https ? 443:80)),
            new UsernamePasswordCredentials("username", "password")
        );

        CloseableHttpClient httpclient = HttpClients
            .custom()
            .setDefaultCredentialsProvider(credsProvider)
            .build();
        URI uri = new URIBuilder()
            .setScheme(https ? "https":"http")
            .setHost(server)
            .setPath(path)
            .build();

        try {
            HttpPost httppost = new HttpPost(uri);
            List<NameValuePair> formparams = new ArrayList<NameValuePair>();

            formparams.add(new FileNameValuePair("access", new File("./svnaccess.txt")));
            UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, Consts.UTF_8);
            httppost.setEntity(entity);
            CloseableHttpResponse response = httpclient.execute(httppost);
            System.out.println(httppost.getRequestLine());
            try {
                System.out.println("----------------------------------------");
                System.out.println(response.getStatusLine());
            } finally {
                response.close();
            }
        } finally {
            httpclient.close();
        }
    }


}

FileNameValuePair.java

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class FileNameValuePair implements org.apache.http.NameValuePair
{
    private String name;
    private File file;

    public FileNameValuePair(String name, File file)
    {
        this.name = name;
        this.file = file;
    }

    public String getName() {
        return name;
    }

    public String getValue() {
        String everything = "";
        try(BufferedReader br = new BufferedReader(new FileReader(file))) {
            StringBuilder sb = new StringBuilder();
            String line = br.readLine();

            while (line != null) {
                sb.append(line);
                sb.append(System.lineSeparator());
                line = br.readLine();
            }
            everything = sb.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return everything;
    }

}

解決了。

@參數表示文件的上傳,而不是其內容。

更改的代碼:

MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addBinaryBody("access", new File("./svnaccess.txt"));
HttpEntity entity = builder.build();
httppost.setEntity(entity);

感謝您指出正確的方向!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM