Search code examples
javajsonrestput

REST PUT with external file JSON to httpClient Java?


I need to translate this for example :

curl -X PUT -u ident:pass -H "Content-Type : application/json" --data-binary @G:\jonJob.json "http://localhost:8080/jobs/"

(this works).

in java with httpClient. I have try a lot of things but nothing work.. Someone could help me please ?

What I've tried :

public class PostFile {
  @SuppressWarnings("deprecation")
public static void main(String[] args) throws Exception {


        CredentialsProvider provider = new BasicCredentialsProvider();
        UsernamePasswordCredentials credentials = new UsernamePasswordCredentials("ident", "pass");
        provider.setCredentials(AuthScope.ANY, credentials);
        HttpClient httpClient = HttpClientBuilder.create().setDefaultCredentialsProvider(provider).build();


    HttpPut httppost = new HttpPut("http://localhost:8080/jobs/");
    File file = new File("G:/jsonJob.json");
    HttpEntity httpEntity = MultipartEntityBuilder.create().addBinaryBody("file", file, ContentType.create("application/json"), file.getName()).build();

    httppost.setEntity(httpEntity);
    System.out.println("executing request " + httppost.getRequestLine());
    HttpResponse response = httpClient.execute(httppost);
    HttpEntity resEntity = response.getEntity();

    System.out.println(response.getStatusLine());
    if (resEntity != null) {
      System.out.println(EntityUtils.toString(resEntity));
    }
    if (resEntity != null) {
      resEntity.consumeContent();
    }

    httpClient.getConnectionManager().shutdown();
  }
}

Result : "HTTP/1.1 415 Not supported type" (unsupported media type)


Solution

  • for your http req headers -H you have java runnable imple with interceptor:

    public void run() {

    CloseableHttpClient httpClient = HttpClients.custom()
            .setConnectionManager(YourConnectionMgr.getInstance())
            .addInterceptorLast(new HttpRequestInterceptor() {
                public void process(
                        final HttpRequest request, 
                        final HttpContext context) throws HttpException, IOException { 
    
                        if (request.getRequestLine().getMethod() == "POST"){                                
                            request.addHeader("Content-Type", "application/json") ;
    

    see examples here to figure out 'connectionManager'

    for simple auth, add this

    to map in memory and POST a file see answer here

    Note, you will eventually want some kind of async http client for java , you can google for that. The apache examples like in the link provided are mostly blocking network calls AFAIK