Я пытаюсь опубликовать JSON, используя GZipStream для PHP, но не уверен, как его уменьшить на стороне PHP. Вот функция для сжатия:
public static string Compress( string text) {
var buffer = Encoding.UTF8.GetBytes(text);
var memoryStream = new MemoryStream();
using (var stream = new GZipStream(memoryStream, CompressionMode.Compress, true)) {
stream.Write(buffer, 0, buffer.Length);
}
memoryStream.Position = 0;
var compressed = new byte[memoryStream.Length];
memoryStream.Read(compressed, 0, compressed.Length);
var gZipBuffer = new byte[compressed.Length + 4];
Buffer.BlockCopy(compressed, 0, gZipBuffer, 4, compressed.Length);
Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gZipBuffer, 0, 4);
return Convert.ToBase64String(gZipBuffer);
}
Это называется так:
request.Headers.Add("Content-Encoding", "gzip");
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate");
postData = Compress(JsonConvert.SerializeObject(incomingData));
byteArray = Encoding.UTF8.GetBytes(postData);
dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
На стороне PHP я делаю это, чтобы получить его:
<?PHP
file_put_contents('test.txt', file_get_contents('php://input'));
file_put_contents('test2.txt', gzuncompress('php://input'));
?>
В моем журнале ошибок Apache я получаю это:
PHP Warning: gzdecode(): data error in /var/www/html/gzip.php on line 3
и в test.txt я получаю это:
0QAAAB+LCAAAAAAABAAdjsEKgzAQRH9lycWLlfbquVLoRWntqelhiYsGZJNuorUU/70htzcPZhj102rAiFrVz4SNiJOWOxwpGa06F+I1OO7dnWQlgQM0myEfrePEvXxB6L1QiNWF4o2CdxxStdTqTBHtHPLMKZs8nvODafNkIg1gJhRMJEBs3MKJkv1MdibwKMHyCCvOC9XQVtBhnKAoSpgtExxL8C7YfOZYabW/dvUHutMCTtEAAAA=
Я также пытался gzdecode
, gzinflate
, что мне делать дальше, чтобы вернуть мой JSON, чтобы я мог обработать его с помощью PHP?
UPDATE:
Я пытался делать то, что предлагал Саммитч, но все равно получал ошибки. Использование этого (https://gist.github.com/magnetikonline/650e30e485c0f91f2f40) для сброса всей информации запроса обеспечивает следующее:
POST /gzip.php HTTP/1.1
HTTP headers:
Authorization: Bearer xxxx
Host: mysite.com
Expect: 100-continue
Request body:
0QAAAB+LCAAAAAAABAAdjsEKgzAQRH9lyaUXK/bqWSn0UmntqelhiYsGZJNuorUU/70htzcPZhj102rAiFrVz4StiJMrdzhSMlp1LsRLcNy7O8lKAkdoN0M+WseJe/mC0HuhEMszxRsF7zikaqFVQxHtHPLMKZs8nvODafNkIg1gJhRMJEBs3MKJkv1MdibwKMHyCCvOC9XQlNBhnOBwKGC2TFAV4F2w+UxVarW/dvUHpEHFyNEAAAA=
Я пробовал как с base64, так и без него.