Отправка файла с запросом POST в службу сервлетов Java - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь отправить файл 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 с почтой?Или почему я получаю эту ошибку?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...