代表 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)

可运行示例

Example.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);

感谢您为我指明正确的方向!