HTTP-сообщение с телом полезной нагрузки JSON, содержащее пустую строку с использованием cURL - PullRequest
0 голосов
/ 05 октября 2018

Я отправляю полезную нагрузку json бэкэнду сервера (обработчик .NET .ashx (c #)) через cURL следующим образом:

curl -X POST -d@filename.txt http://localhost:49797/Handler.ashx -H "Content-Type:application/json"

В JSON (в filename.txt) есть пробелстрока в нем (если кто-нибудь из вас узнает его из https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html, который я использую для проверки моего кода подписи AWS4)

{ "expiration": "2015-12-30T12:00:00.000Z",
  "conditions": [
   {"bucket": "sigv4examplebucket"},
    ["starts-with", "$key", "user/user1/"],
    {"acl": "public-read"},
    {"success_action_redirect":"http://sigv4examplebucket.s3.amazonaws.com/successful_upload.html"},
    ["starts-with", "$Content-Type", "image/"],
    {"x-amz-meta-uuid": "14365123651274"},
    {"x-amz-server-side-encryption": "AES256"},
    ["starts-with", "$x-amz-meta-tag", ""],

    {"x-amz-credential": "AKIAIOSFODNN7EXAMPLE/20151229/us-east-1/s3/aws4_request"},
    {"x-amz-algorithm": "AWS4-HMAC-SHA256"},
    {"x-amz-date": "20151229T000000Z" }
  ]
}

Я читаю полезную нагрузку на сервере следующим образом:

private string getPayloadString(HttpRequest Request)
    {
        string documentContents;
        using (Stream receiveStream = Request.InputStream)
        {
            using (StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8))
            {
                documentContents = readStream.ReadToEnd();
            }
        }
        return documentContents;
    }

Когда я проверяю 'documentContents' в visual studio, я в основном получаю следующую строку:

{ "expiration": "2015-12-30T12:00:00.000Z",  "conditions": [    {"bucket": "sigv4examplebucket"},    ["starts-with", "$key", "user/user1/"],    {"acl": "public-read"},    {"success_action_redirect": "http://sigv4examplebucket.s3.amazonaws.com/successful_upload.html"},    ["starts-with", "$Content-Type", "image/"],    {"x-amz-meta-uuid": "14365123651274"},    {"x-amz-server-side-encryption": "AES256"},    ["starts-with", "$x-amz-meta-tag", ""],    {"x-amz-credential": "AKIAIOSFODNN7EXAMPLE/20151229/us-east-1/s3/aws4_request"},    {"x-amz-algorithm": "AWS4-HMAC-SHA256"},    {"x-amz-date": "20151229T000000Z" }  ]}

Что, в свою очередь, когда я base64Encode, не соответствует ожидаемому значению настраница AWS (она совпадает, если я буквально жестко закодировал строку в коде своего сервера перед его кодированием)

Мои вопросы

  1. Я теряю пустую строкукак я читаю полезную нагрузку?Если да, то как мне это сделать?
  2. Разве cURL не отправляет данные точно так, как они есть в моем текстовом файле?
  3. Это просто Visual Studio, удаляя их, когда я смотрю на них вТекстовый визуализатор?

Спасибо, эта подпись, не совпадающая с ошибкой от AWS, разрушает мою голову!

1 Ответ

0 голосов
/ 05 октября 2018

Я предлагаю использовать --data-binary с curl для поддержания разрывов строк.

Отсюда https://ec.haxx.se/http-post.html

POSTing двоичного файла При чтении из файла -d будетубрать возврат каретки и перевод строки.Используйте --data-binary, если вы хотите, чтобы curl считывал и использовал данный файл в двоичном формате в точности так, как указано:

curl --data-binary @filename http://example.com/

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