Я пытаюсь создать приложение Java, чтобы выполнить следующее, которое работает в CURL на Windows.Java Загрузить файл по HTTP-запросу POST
curl -x XXX.XXX.XXX.XXX:8080 -X POST --data-binary "@C:\Users\XXXXX\Documents\batch2.txt" http://XXXXX.XXX.XXXXXX.XXX/XX/XXXXXXX/XX/XXXXXXX/XXXXXXX
Я был в состоянии повторить вызов, принимая содержимое файла и размещение его прямо на URL в Java с помощью HttpURLConnection однако это не является жизнеспособным и предпочел бы использовать метод файла, как это может быть довольно большой.
Код я в настоящее время является:
import java.io.File;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.apache.http.entity.mime.HttpMultipartMode;
public class PostFile {
public static void main(String[] args) throws Exception {
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost httppost = new HttpPost("http://XXXXX.XXX.XXXXXX.XXX/XX/XXXXXXX/XX/XXXXXXX/XXXXXXX");
RequestConfig requestConfig = RequestConfig.copy(RequestConfig.DEFAULT)
.setProxy(new HttpHost("XXX.XXX.XXX.XXX", 8080))
.build();
httppost.setConfig(requestConfig);
httppost.addHeader("Content-Type","data/binary");
File file = new File("C:/Users/XXXXXX/Documents/batch2.txt");
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.addBinaryBody("batch", file);
final HttpEntity entity = builder.build();
httppost.setEntity(entity);
System.out.println("executing request " + httppost.getRequestLine() + httppost.getConfig());
HttpResponse response = httpclient.execute(httppost);
HttpEntity resEntity = response.getEntity();
System.out.println(response.getStatusLine());
if (resEntity != null) {;
System.out.println(EntityUtils.toString(resEntity));
}
httpclient.close();
}
}
Проблема, которую я имею, что она не обеспечивает такой же ответ, и кажется, что он не в состоянии POST файл.
'--data-binary' означает' -X Post', так что вам не нужно дать '-X' вариант, и это также означает' Content-Type: применение/х-www- form-urlencoded' (см. [curl manpage] (https://curl.haxx.se/docs/manpage.html#-d)), но ваш Java-код отправляет 'Content-Type: data/binary', что вероятно, ваша проблема. Что касается «не предоставления одного и того же ответа» *, было бы проще помочь вам, если вы разделите два ответа с нами. – Andreas
Успешный ответ = Пакетный-id-XXXXX Плохой отклик = Пакет пуст – Charabon
Я имел в виду показать полный ответ, включая заголовки. Во всяком случае, я только заметил, что ваш Java-код также отправляет файл как * multi-part *. Кажется, у вас есть идея, что команда 'curl' - это« загрузка »файла. Это не. Он просто отправляет файл на сервер в виде содержимого POST, закодированного в форме, что означает, что файл должен следовать за этим форматом содержимого. Все, что вам нужно сделать в Java, - это установить правильный контент Content-Type и потоковое содержимое файла напрямую. – Andreas