当前位置: 首页 > 知识库问答 >
问题:

PostAsJsonAsync#-如何为POST请求正确设置标头-错误请求400

楚硕
2023-03-14

大家好。

此外,在请求中有一个基本认证,在这种情况下,我将它包含在邮递员中,它工作正常。另一方面,在我的C#脚本中,我是这样执行的:

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

 public class patientMediktor{
    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请求的助手类。我插入所有需要的数据,然后将对象序列化为JSON,正如你们中的一些人建议我这样做的那样。它相当干净。

 public async Task<string> MediktorHubCrearUsuario(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 patientMediktor();
        data.deviceId = userId;
        data.deviceType = "WEB";
        data.apiVersion = "4.0.3";
        data.language = "es_ES";
        data.externUser = new patientMediktor.externUserClass(userId, guid, guid, sexoStr); // extern user
        data.includeAuthToken = "true";

        string output = JsonConvert.SerializeObject(data);

        var ServerMedictor = conf;
        var client =  new HttpClient{BaseAddress = new Uri(ServerMedictor)};
        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个坏请求。

亲切的问候和感谢你

共有3个答案

百里锋
2023-03-14

答案就在这里。Basic Auth的头的构造从一开始就是错误的。为了对它进行编码,我必须像新系统那样传递它。网Http。标题。AuthenticationHeaderValue(“Basic”,Convert.tobase64字符串(byteArray)) 并因此响应请求。我还将PostAsJsonAsync替换为PostAsync。它就像一个符咒!最后,我得到一个状态代码200OK,其中包含我需要传递给视图的数据。

public async Task<string> CreateUser(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 patientMediktor();
            data.deviceId = userId;
            data.deviceType = "WEB";
            data.apiVersion = "4.0.3";
            data.language = "es_ES";
            data.externUser = new patientMediktor.externUserClass(userId, guid, guid, sexoStr); // extern user
            data.includeAuthToken = true;

            string json = JsonConvert.SerializeObject(data);
            var Client =  new HttpClient();
            var prueba = "https://xxxxxx.com:443/";
            Client.BaseAddress = new Uri(prueba);

            var byteArray = Encoding.ASCII.GetBytes("xxxxxxxx:xxxxxxxxx");
            Client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
            var response = Client.PostAsync("backoffice/services/externUser", new StringContent(json, Encoding.UTF8, "application/json")).Result;

            response.EnsureSuccessStatusCode();
            var respuesta = await response.Content.ReadAsStringAsync();
            return respuesta;
   }
訾俊名
2023-03-14

似乎应该删除以下行末尾的逗号:

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

一般来说,更喜欢使用模型类并序列化它们(使用Newtonsoft.Json(示例)或系统)。文本Json),而不是硬编码字符串。

令狐和裕
2023-03-14

尝试使用PostAsync而不是PostAsJsonAsync

var content=新的StringContent(JsonConvert.SerializeObject(数据),编码。UTF8,“应用程序/json”);

var request=等待httpClient。PostAsync(请求URL、内容);

请在不支持PostAsJsonAsync方法C的HttpClient上查找有关“PostAsJsonAsync”的更多详细信息#

 类似资料:
  • 在Play框架中使用Google Plus Sign In Api时,是否必须以不同的方式设置头?是不是我做错了什么? null null 然而,当我使用所有正确的参数发出此请求时,我得到了这个错误 要在Play Framework中发出HTTP请求,您可以使用。我这样提出要求 如您所见,我设置了头部。为了确保设置头的工作正常,我制作了一个程序,在NodeJS(源代码)中吐出请求的头,这就是结果

  • 问题内容: 我的应用程序中有一个需要基本身份验证的特定请求,因此我需要为该请求设置Authorization标头。我读过有关设置HTTP请求标头的信息,但据我所知,它将为该方法的所有请求设置标头。我的代码中有这样的内容: 但我不希望我的每一个帖子请求都发送此标头。有什么方法可以仅为我想要的一个请求发送标头吗?还是我必须在请求后将其删除? 问题答案: 传递给每次调用标头的config对象中有一个标头

  • 我正在为一个项目使用Hackerrank API。查看官方文档,点击这里! 在他们的网站上有一个使用UNIREST的例子, 由于我使用的是axios,所以我将其转换为类似的axios代码,如下所示: 我希望这只适用于示例中所示的示例,但它给我带来了以下错误: 请求失败,状态代码为400 错误:请求失败,状态代码为400 在createError(createError.js:16) 在sett(s

  • 我试图找到使用httr包通过R连接Appannie的API的方法(根本没有API连接的经验)。API要求包含来自appannie网站的请求标题引用:注册App Annie帐户并生成API密钥。将此密钥添加到您的请求标头中,如下所示: 授权:持有人“”引用 我写了这样的代码 命令http_status(getdata)显示我"客户端错误:(401)未经授权"有人能帮我吗,我做错了什么?

  • 堆栈跟踪: java.lang.NullPointerException 在locusttask.salescrm.execute处(salescrm.java:76) 在java.util.concurrent.ThreadPoolExecutor$worker.run(ThreadPoolExecutor.java:624) 在java.lang.Thread.Run(thread.java: