PostAsJsonAsync C# - 如何为 POST 请求正确设置标头 - BAD REQUEST 400

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

大家好。

我遇到了下一个问题。 我正在尝试执行 POST 请求,但是当我使用 Visual Studio Code 的调试器编译并执行它时,出现 400 Bad Request 错误。 不管怎样,当我在 Postman 中执行相同的 POST 请求时,我收到了一个 200 OK 状态请求,其中包含继续我正在处理的下一部分所需的所有值。

此外,请求中有一个基本身份验证,在本例中我将其包含在 Postman 中并且工作正常。另一方面,在我的 C# 脚本中,我是这样执行的:

*这是我的模型,其中包含我的所有数据,用于将对象序列化为 JSON。

 public class patient{
    public string deviceId { get; set; }        
    public string deviceType { get; set; }
    public string apiVersion { get; set; }
    public string language { get; set; }
    public externUserClass externUser{ get;set; }

    public class externUserClass{
        public externUserClass(string partnerExternalId, string username, string newPassword, string gender){
            this.partnerExternalId = partnerExternalId;
            this.username = username;
            this.newPassword = newPassword;
            this.gender = gender;
        }
        public string partnerExternalId { get; set; }
        public string username { get; set; }
        public string newPassword { get; set; }
        public string gender { get; set; }
    }
    public string includeAuthToken{ get; set; }
}

*这是我用于创建 POST 请求的 Helper 类。我插入了我需要的所有数据,然后将对象序列化为 JSON,正如你们中的一些人建议我这样做的。还蛮干净的。

 public async Task<string> HubCreateUser(string conf, string userId, string sexo, string deviceId)
    {
        var sexoStr = "";  
        if(sexo == "MALE") {
            sexoStr = "MALE";
        } else if(sexo == "FEMALE") {
            sexoStr = "FEMALE";
        }

        var guid = Guid.NewGuid().ToString(); // guid para el username y el password
        var data = new patient();
        data.deviceId = userId;
        data.deviceType = "WEB";
        data.apiVersion = "4.0.3";
        data.language = "es_ES";
        data.externUser = new patient.externUserClass(userId, guid, guid, sexoStr); // extern user
        data.includeAuthToken = "true";

        string output = JsonConvert.SerializeObject(data);

        var severDestination= conf;
        var client =  new HttpClient{BaseAddress = new Uri(severDestination)};
        MediaType = "application/json";
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(MediaType)); //ACCEPT header
        client.DefaultRequestHeaders.Authorization =  new AuthenticationHeaderValue("xxxxxx", "xxxxxxxxxxxx");
        var Client = client;
        var request = await Client.PostAsJsonAsync("externUser", output);

        request.EnsureSuccessStatusCode();
        var status = await request.Content.ReadAsStringAsync();
        return status;
    }

如果有人知道如何处理这个问题,我将非常感激。 我将继续尝试结合如何解决这个问题的替代方案。 *尽管进行了修改,我仍然遇到同样的问题。我确实序列化了该对象,并且按照我需要的方式获取它。但是,每当涉及到请求时,它都会给我一个 400 Bad Request。

亲切的问候并谢谢你

c# post http-headers postman basic-authentication
2个回答
4
投票

尝试使用

PostAsync
而不是
PostAsJsonAsync

var content = new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json");

var request  = await httpClient.PostAsync(requestUrl, content);

请在

HttpClient 不支持 PostAsJsonAsync 方法 C#
找到有关 PostAsJsonAsync

的更多详细信息

1
投票

看来你应该删除以下行末尾的逗号:

sexoStr = "\"gender\": \"MALE\",";
...
sexoStr = "\"gender\": \"FEMALE\",";

一般来说,更喜欢使用模型类并序列化它们(使用

Newtonsoft.Json
(example) 或
System.Text.Json
),而不是硬编码字符串。

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