Я пытаюсь отправить файл JSON с запросом POST на мой геосервер.Мой файл JAR запускается как служба OWS (сервлет Java).
Служба:
public void upload(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String fileName = request.getHeader("fileName");
File saveFile = new File(SAVE_DIR + fileName);
InputStream inputStream = request.getInputStream();
FileOutputStream outputStream = new FileOutputStream(saveFile);
byte[] buffer = new byte[BUFFER_SIZE];
int bytesRead = -1;
System.out.println("Receiving data...");
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
System.out.println("Data received.");
outputStream.close();
inputStream.close();
System.out.println("File written to: " + saveFile.getAbsolutePath());
}
}
Проверка Java:
URL url = new URL("http://localhost:8080/geoserver/ows?request=upload&service=GeoRestTransfer&version=1.0.0");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("fileName", "test.json");
conn.setDoOutput(true);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
mapper.writeValue((OutputStream) wr, json); //JSONObject
wr.flush();
wr.close();
int responseCode = conn.getResponseCode();
System.out.println("Response Code : " + responseCode);
Тест Curl:
curl -d "@test.json" -X POST "http://localhost:8080/geoserver/ows?request=upload&service=GeoRestTransfer&version=1.0.0"
JSON FILE test.json :
{"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
]
}
}}
РЕДАКТИРОВАТЬ1:
Новый тест:
Я посылаю ту же строку JSON в заголовке моей службе с conn.setRequestProperty("fileContent", jsonString);
, прочитайте этоЗаписать его в мой файл, и он работает.Но почему это не работает с телом?
URL url = new URL("http://localhost:8080/geoserver/ows?request=upload&service=GeoRestTransfer&version=1.0.0");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("fileName", "test.json");
conn.setRequestProperty("fileContent", jsonString);
conn.setDoOutput(true);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
mapper.writeValue((OutputStream) wr, content);
wr.flush();
wr.close();
int responseCode = conn.getResponseCode();
System.out.println("Response Code : " + responseCode);
Проблема:
Если я отправляю этот запрос POST с помощью java или curl, я всегда получаюошибка.
Ошибка:
org.xmlpull.v1.XmlPullParserException: разрешено только пустое содержимое перед начальным тегом, но не {(позиция: START_DOCUMENT видел {...@ 1: 1)
Если я попробую его с пустым телом поста, он сработает и создаст пустой файл.Я могу отправить, как мой новый тест, содержимое с заголовком, и это тоже работает.Разве нельзя отправить jsonobject в теле в службу OWS с почтой?Или почему я получаю эту ошибку?