Как отправить строку, сжатую с помощью GZIP, из приложения Java в веб-сервис PHP

У меня есть эта проблема со сжатием GZIP:

Мне нужно отправить методом POST огромную строку JSON, которая слишком велика, чтобы ее можно было принять как URL (например: HTTP: // локальный / приложение / отправить /JSON STRING, кодированный BASE64), чем это приводит к ошибке HTTP 403

Итак, мне нужно сжать мой JSON, и я нашел способ сделать это с помощью сжатия GZIP, который я могу распаковать с помощью gzdecode () в PHP.

но это не работает …

мои функции compress () и depress () отлично работают внутри моего Java-приложения, но когда я отправляю их в веб-сервис, что-то идет не так, и gzdecode () не работает.
Я понятия не имею, что мне не хватает, мне нужна помощь

функции, используемые в приложении Java (клиент)

    public String Post(){
String retorno = "";
String u = compress(getInput());
u = URLEncoder.encode(URLEncoder.encode(u, "UTF-8"));

URL uri = new URL(url + u);

HttpURLConnection conn = (HttpURLConnection) uri.openConnection();

conn.setDoOutput(false);
conn.setRequestMethod(getMethod());

conn.setRequestProperty("Content-encoding", "gzip");
conn.setRequestProperty("Content-type", "application/octet-stream");

BufferedReader buffer = new BufferedReader(
new InputStreamReader((conn.getInputStream())));

String r = "";
while ((r = buffer.readLine()) != null) {
retorno = r + "\n";
}
return retorno;
}

Функция сжатия GZIP (клиент)

public static String compress(String str) throws IOException {

byte[] blockcopy = ByteBuffer
.allocate(4)
.order(java.nio.ByteOrder.LITTLE_ENDIAN)
.putInt(str.length())
.array();
ByteArrayOutputStream os = new ByteArrayOutputStream(str.length());
GZIPOutputStream gos = new GZIPOutputStream(os);
gos.write(str.getBytes());
gos.close();
os.close();
byte[] compressed = new byte[4 + os.toByteArray().length];
System.arraycopy(blockcopy, 0, compressed, 0, 4);
System.arraycopy(os.toByteArray(), 0, compressed, 4,
os.toByteArray().length);

return Base64.encode(compressed);

}

метод php, используемый для получения URL-адреса (сервер, используя Slim / PHP Framework)

init::$app->post('/enviar/:obj/', function( $obj ) {
$dec = base64_decode(urldecode( $obj ));//decode url and decode base64 tostring
$dec = gzdecode($dec);//here is my problem, gzdecode() doesn't work
}

почтовый метод

public Sender() throws JSONException {
//
url = "http://192.168.0.25/api/index.php/enviar/";
method = "POST";
output = true;
//
}

2

Решение

Как отмечено в некоторых комментариях.

  1. Большие данные следует отправлять как запрос POST вместо GET. Параметры URL должны использоваться только для отдельных переменных. Как вы заметили, длина URL-адреса ограничена несколькими килобайтами, и отправлять большие объемы таким способом не очень хорошая идея (даже если GZIP сжат).

  2. Ваш код сжатия GZIP кажется неправильным. Пожалуйста, попробуйте это:

  public static String compress(String str) throws IOException {
ByteArrayOutputStream os = new ByteArrayOutputStream(str.length());
GZIPOutputStream gos = new GZIPOutputStream(os);
gos.write(str.getBytes());
os.close();
gos.close();
return Base64.encodeToString(os.toByteArray(),Base64.DEFAULT);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]