【问题标题】:C# CURL POST(Content-Type, Hash key)C# CURL POST(内容类型,哈希键)
【发布时间】:2018-08-15 09:42:25
【问题描述】:

我目前正在尝试在 C# (API) 中发送 POST 请求,但我在内容类型和授权方面遇到了一些问题,因为它的格式为 apiHash、apiKey。

卷曲示例:

curl -i -XPOST https://sandboxapi.g2a.com/v1/order \
-H "Authorization: qdaiciDiyMaTjxMt, 74026b3dc2c6db6a30a73e71cdb138b1e1b5eb7a97ced46689e2d28db1050875" \
-H 'Content-Type: application/json' \
-d '{"product_id": "10000027819004", "max_price": 45.0}'

API 文档: https://www.g2a.com/integration-api/documentation/#api-Orders-AddOrder

这是我目前的代码:

private static readonly HttpClient client = new HttpClient();

public async Task < string > makeRequest() {
    var values = new Dictionary < string,
        string > {
            {
                "product_id",
                "10000027819004"
            },
            {
                "max_price",
                "45.0"
            }
        };

    var content = new FormUrlEncodedContent(values);

    AuthenticationHeaderValue authHeaders = new AuthenticationHeaderValue("qdaiciDiyMaTjxMt", "74026b3dc2c6db6a30a73e71cdb138b1e1b5eb7a97ced46689e2d28db1050875");
    client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json; charset=utf-8");

    client.DefaultRequestHeaders.Authorization = authHeaders;

    var response = await client.PostAsync("https://sandboxapi.g2a.com/v1/order", content);

    var responseString = await response.Content.ReadAsStringAsync();
    return responseString;
}

我尝试了多种解决方案,但似乎无法将它们全部正确(内容类型、授权和参数)。

【问题讨论】:

  • 执行 POST 时的响应是什么?
  • 当前其 Content-Type Header 为空或不允许。

标签: c# api asynchronous post httpclient


【解决方案1】:

你必须像这样设置内容类型:

client.DefaultRequestHeaders
  .Accept
  .Add(new MediaTypeWithQualityHeaderValue("application/json"));

这将解决问题。

【讨论】:

  • 试用时请告知。
  • 你好,试过了,还是说Content-Type header empty or not allowed。
【解决方案2】:

当 curl 示例发送 JSON 时,您发送的不是 JSON 的 FormUrlEncodedContent

重构您的方法以在 StringContent 中使用具有正确内容类型集的实际序列化 JSON 字符串。

public async Task<string> makeRequest() {
    var values = new {
        product_id = "10000027819004",
        max_price = 45.0
    };

    //-d '{"product_id": "10000027819004", "max_price": 45.0}'
    var json = JsonConvert.SerializeObject(values); //using Json.Net
    var content = new StringContent(json);

    var auth = "qdaiciDiyMaTjxMt, 74026b3dc2c6db6a30a73e71cdb138b1e1b5eb7a97ced46689e2d28db1050875";
    //-H "Authorization: qdaiciDiyMaTjxMt, 74026b3dc2c6db6a30a73e71cdb138b1e1b5eb7a97ced46689e2d28db1050875" \
    client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", auth);
    //-H 'Content-Type: application/json' \
    client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json");

    var response = await client.PostAsync("https://sandboxapi.g2a.com/v1/order", content);

    var responseString = await response.Content.ReadAsStringAsync();
    return responseString;
}

【讨论】:

  • 你好,我刚试了下,还是说Content-Type header empty or not allowed。
  • 提供的代码是准确的,所以剩下的就是检查两种方法发送的原始请求,看看有什么区别。
  • 仍然无法正常工作,但很奇怪,我已经检查过了,Content-Type 现在在标题中。 code 标头:{ 授权:qdaiciDiyMaTjxMt,74026b3dc2c6db6a30a73e71cdb138b1e1b5eb7a97ced46689e2d28db1050875 内容类型:application/json; charset=utf-8 内容长度:48 }code
  • @Restr 我删除了 UTF 编码,看看是否有区别。
猜你喜欢
  • 2017-01-24
  • 2017-06-14
  • 1970-01-01
  • 2012-11-09
  • 2017-08-13
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
相关资源
最近更新 更多