Http-ответ: невозможно преобразовать JSON в поток - PullRequest
1 голос
/ 21 апреля 2020

У меня есть API в JAVA для загрузки zip-файла на сервер в Delphi, и я делаю это следующим образом:

        DSRESTConnection conn = new DSRESTConnection();
        conn.setHost("example.com");
        conn.setPort(8080);
        TServerMethods1 proxy = new TServerMethods1(conn);
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            BufferedOutputStream bos = new BufferedOutputStream(baos);
            ZipOutputStream zos = new ZipOutputStream(bos);
            zos.putNextEntry(new ZipEntry("test.json"));
            byte[] bytes = inputJson.getBytes();
            zos.write(bytes, 0, bytes.length);
            zos.close();
            bos.close();
            baos.close();
            TStream outZip = new TStream(baos.toByteArray());

            zipResponse = proxy.UserZipUpLoad("username", "password", 5, outZip, outZip.asByteArray().length);
        } catch (DBXException | IOException e) {
            e.printStackTrace();
        }

и вот API:

    public UserZipUpLoadReturns UserZipUpLoad(String user, String pwd, int ZipType, TStream strmUpLoad, long iSize) throws DBXException {
  DSRESTCommand cmd = getConnection().CreateCommand();
  cmd.setRequestType(DSHTTPRequestType.POST);
  cmd.setText("TServerMethods1.UserZipUpLoad");
  cmd.prepare(get_TServerMethods1_UserZipUpLoad_Metadata());
  cmd.getParameter(0).getValue().SetAsString(user);
  cmd.getParameter(1).getValue().SetAsString(pwd);
  cmd.getParameter(2).getValue().SetAsInt32(ZipType);
  cmd.getParameter(3).getValue().SetAsStream(strmUpLoad);
  cmd.getParameter(4).getValue().SetAsInt64(iSize);
  getConnection().execute(cmd);
  UserZipUpLoadReturns ret = new UserZipUpLoadReturns();
  ret.ReturnCode = cmd.getParameter(5).getValue().GetAsInt32();
  ret.ReturnString = cmd.getParameter(6).getValue().GetAsString();
  ret.returnValue = cmd.getParameter(7).getValue().GetAsInt32();
  return ret;
}

Чтобы создать тело для запроса, _parameter создается из параметров в API, которые не могут быть в URL, например, byteArray или blob:

boolean CanAddParamsToUrl = true;
        _parameters = new TJSONArray();
        for (DSRESTParameter parameter : ParametersToSend)
            if (CanAddParamsToUrl && isURLParameter(parameter))
                URL += encodeURIComponent(parameter) + '/';
            else // add the json representation in the body
            {
                CanAddParamsToUrl = false;
                parameter.getValue().appendTo(_parameters);
            }

и с использованием _parameters, тело построено:

TJSONObject body = new TJSONObject();
                body.addPairs("_parameters", _parameters);
                p.setEntity(new StringEntity(body.toString(), "utf-8"));

У меня нет доступа к стороне сервера и я не знаю, что там происходит. Когда я отправляю объект JSON или любые другие строки, сервер возвращает ok, но как только я заархивировал JSON и отправил его, сервер вернул ошибку 500, говорящую «Невозможно преобразовать входные данные JSON в поток». Я думаю, что JSON, на который он ссылается, это тело, а не строка JSON в файле.

Из последней части кода я могу понять, почему строка будет работать, но я не знаю, как использовать текущий код для отправки zip-файла по запросу. Есть ли способ использовать этот код? или я должен изменить это? Если так, то как? Кто-нибудь знает, если это ошибка?

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