имеется XML файл match.xml, через curl легко отправить POST и добавить в базу.
curl -F "xml=@match.xml" web_url
Стандартная реализация POST на Java возвращает мне POST Response Code :: 400 Bad Request
public static void sendPOST(String data) throws IOException {
URL obj = new URL(FinalConstants.BETRADAR_UPLOAD);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("User-Agent", USER_AGENT);
// For POST only - START
con.setDoOutput(true);
OutputStream os = con.getOutputStream();
os.write(data.getBytes());
os.flush();
os.close();
// For POST only - END
int responseCode = con.getResponseCode();
System.out.println("POST Response Code :: " + responseCode);
if (responseCode == HttpURLConnection.HTTP_OK) { //success
BufferedReader in = new BufferedReader(new InputStreamReader(
con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
// print result
System.out.println(response.toString());
} else {
System.out.println("POST request not worked");
}
}
и при таких настройках возвращает такую же ошибку
httpURLConnection.setReadTimeout(10000);
httpURLConnection.setConnectTimeout(15000);
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setRequestProperty("Content-Type", "text/xml");
httpURLConnection.setDoInput(true);
httpURLConnection.setDoOutput(true);
Подскажите как работает curl -F
? Как мне корректно отправить данные ?
UPD
Несколько вариантов попробовал с HttpClient и все они выдают следующее
HttpResponseProxy{HTTP/1.1 400 Bad Request [Server: nginx, Date: Thu, 09 Feb 2017 20:07:18 GMT, Content-Type: application/octet-stream, Content-Length: 0, Connection: keep-alive]}
1 Вариант
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(FinalConstants.UPLOAD);
HttpEntity entity =
new ByteArrayEntity(data.getBytes("UTF-8"),
ContentType.TEXT_XML);
post.setEntity(entity);
HttpResponse response = client.execute(post);
String result = EntityUtils.toString(response.getEntity());
2 вариант
InputStream in ;
StringEntity entity = new StringEntity(data, ContentType.create(
"text/xml", Consts.UTF_8));
entity.setChunked(true);
HttpPost httppost = new HttpPost( FinalConstants.UPLOAD);
httppost.setEntity(entity);
HttpClient client = HttpClients.createDefault();
HttpResponse response = client.execute(httppost);
System.out.println(response.toString());
in=response.getEntity().getContent();
String body = IOUtils.toString(in);
System.out.println(body);
Также вариант с использованием файла
builder.addBinaryBody(
"file",
new FileInputStream(f),
ContentType.APPLICATION_OCTET_STREAM, // Также как и с другими типами
f.getName()
);
Все таки мне хотелось бы отправить строку, а не файл
curl -F
эмулирует отправку HTTP формы, "xml=@match.xml"
- прикрепить файл с указанным именем.
Для такого HTTP запроса (с прикрепленным файлом), Content-Type должен быть multipart/form-data
, а одна из частей такого запроса (part) должна иметь имя xml
(для Вашего примера) и содержать файл с соответсвующим Content-Type.
Честно говоря, как уже подсказали в комменте к вопросу, проще использовать библиотеку HttpClient от Apache.
Примеров как отправлять multipart/form-data
с использованием HttpClient полно, вот первый попавшийся из гугла: http://stackoverflow.com/questions/1378920/how-can-i-make-a-multipart-form-data-post-request-using-java
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Хотелось бы узнать: какую строку возвращает substring(0, 0), если вызывающая строка состоит только из одного символа?