首页 > 解决方案 > 带有 JSON 有效负载正文的 HTTP 帖子,其中包含使用 cURL 的空行

问题描述

我通过 cURL 将 json 有效负载发送到服务器后端(.NET .ashx (c#) 处理程序),如下所示:

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;
    }

当我在 Visual Studio 中检查“documentContents”时,我基本上得到一个字符串,如下所示:

{ "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 发送的数据是否与我的 txt 文件中的数据完全相同?
  3. 当我在文本可视化器中查看它时,它只是 Visual Studio 将其剥离吗?

谢谢,这个来自 AWS 的签名不匹配错误让我很头疼!

标签: c#jsoncurlhttp-post

解决方案


我建议使用 --data-binary 和 curl 来维护换行符。

从这里https://ec.haxx.se/http-post.html

POSTing binary 从文件中读取时,-d 将去掉回车符和换行符。如果您希望 curl 完全按照给定的二进制格式读取和使用给定文件,请使用 --data-binary:

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


推荐阅读