C# 无法使用 HttpRequestMessage 发布数据并获得 400 状态

问题描述 投票:0回答:3

我尝试了几种不同的方法我无法获得 pipelineId 发布(接收 400),请参见下面的代码:

{
                client.BaseAddress = new Uri(_serviceConfig.DataGapsBaseUrl);
                var request = new HttpRequestMessage(HttpMethod.Post, "/piper/jobs");

                var jsonContent = new StringContent(JsonConvert.SerializeObject(new
                {
                    pipelineId = _serviceConfig.DataPipelineId
                }), Encoding.UTF8, "application/json");
                
                request.Content = jsonContent;

                var token = await GetToken();
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.ToString());

                var result = await client.SendAsync(request);

                var json = JsonConvert.DeserializeObject<JToken>(result.Content.ReadAsStringAsync().Result);
                var jobId = json["id"].ToString();
                return jobId;
            }
        }

当我使用与上述相同的 Postman 操作时,我得到 200 个状态和结果:

c# json http-post httpclient
3个回答
1
投票

因为你使用的是 async await ,所以在任何地方都使用它,而且这种语法更常见

using HttpClient client = new HttpClient { BaseAddress = new Uri(baseUri) };

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

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.ToString());

var jsonContent = new StringContent(JsonConvert.SerializeObject(new
                {
                    pipelineId = _serviceConfig.DataPipelineId
                }), Encoding.UTF8, "application/json");

 var response = await client.PostAsync(uri, jsonContent);

 var json = await response.Content.ReadAsStringAsync();

var jObj = JObject.Parse(json);
var createTime =  (string) jObj["createTime"]; //I can't see Id in Postman

0
投票

初学者:

  • 你忘了序列化 StringContent
var jsonContent = new StringContent(JsonConvert.SerializeObject(new
                {
                    pipelineId = _serviceConfig.DataPipelineId
                }), Encoding.UTF8, "application/json");

同时使用 await 更改以下内容以防止线程锁定

var json = JsonConvert.DeserializeObject<JToken>(await result.Content.ReadAsStringAsync());

请注意,如果您的客户端是单例并且您正在从异步上下文设置身份验证,则它可能会被另一个调用覆盖,要么重新创建客户端,要么可能在 HttpRequestMessage 上设置授权:

var request = new HttpRequestMessage(HttpMethod.Post, "/piper/jobs");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token.ToString()

0
投票

对不起伙计们,我的错我需要发送这个:

{“pipelineId”:“zxxzxzxzxz18”,“输入”:{“Batch_Id”:9999}}

需要弄清楚如何使用双引号并解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.