PostAsJsonAsync C# - 如何为 POST 请求正确设置 headers - BAD REQUEST 400
PostAsJsonAsync C# - How to set headers correctly for POST request - BAD REQUEST 400
大家好。
我遇到了下一个问题。
我正在尝试执行 POST 请求,但是当我使用 Visual Studio 代码的调试器编译和执行它时,我收到错误 400 Bad Request。
不管怎样,当我在 Postman 中执行相同的 POST 请求时,我收到一个 200 OK 状态请求,其中包含我继续进行下一部分工作所需的所有值。
此外,请求中有一个 Basic Auth,在这种情况下,我将其包含在 Postman 中并且工作正常。另一方面,在我的 C# 脚本中,我是这样执行的:
*这是我的模型,其中包含了我的所有数据,用于将 object 序列化为 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; }
}
*这是我的助手 class,用于创建 POST 请求。我插入了我需要的所有数据,然后我将 object 序列化为 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;
}
如果有人知道如何处理这个问题,我们将不胜感激。
我将继续尝试组合如何解决这个问题的替代方案。
*尽管进行了修改,但我仍然遇到同样的问题。我确实序列化了 object 并且我正在按照我需要的方式获取它。但是,每当涉及到请求时,它都会给我一个 400 Bad Request。
问候并感谢您
您似乎应该删除以下行末尾的逗号:
sexoStr = "\"gender\": \"MALE\",";
...
sexoStr = "\"gender\": \"FEMALE\",";
一般来说,更喜欢使用模型 class 并序列化它们(使用 Newtonsoft.Json
(example) 或 System.Text.Json
),而不是硬编码字符串。
尝试使用 PostAsync 而不是 'PostAsJsonAsync'
var content = new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json");
var request = await httpClient.PostAsync(requestUrl, content);
请在
找到有关 'PostAsJsonAsync' 的更多详细信息
答案就在这里。 Basic Auth的header的构造从一开始就是错误的。为了对其进行编码,我必须像这样 new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
传递它,因此传递给请求。
我还将 PostAsJsonAsync 替换为 PostAsync。它就像一个魅力!
最后,我得到一个状态代码 200 OK,其中包含我需要传递给我的视图的数据。
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;
}
大家好。
我遇到了下一个问题。
我正在尝试执行 POST 请求,但是当我使用 Visual Studio 代码的调试器编译和执行它时,我收到错误 400 Bad Request。
不管怎样,当我在 Postman 中执行相同的 POST 请求时,我收到一个 200 OK 状态请求,其中包含我继续进行下一部分工作所需的所有值。
此外,请求中有一个 Basic Auth,在这种情况下,我将其包含在 Postman 中并且工作正常。另一方面,在我的 C# 脚本中,我是这样执行的:
*这是我的模型,其中包含了我的所有数据,用于将 object 序列化为 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; }
}
*这是我的助手 class,用于创建 POST 请求。我插入了我需要的所有数据,然后我将 object 序列化为 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;
}
如果有人知道如何处理这个问题,我们将不胜感激。 我将继续尝试组合如何解决这个问题的替代方案。 *尽管进行了修改,但我仍然遇到同样的问题。我确实序列化了 object 并且我正在按照我需要的方式获取它。但是,每当涉及到请求时,它都会给我一个 400 Bad Request。
问候并感谢您
您似乎应该删除以下行末尾的逗号:
sexoStr = "\"gender\": \"MALE\",";
...
sexoStr = "\"gender\": \"FEMALE\",";
一般来说,更喜欢使用模型 class 并序列化它们(使用 Newtonsoft.Json
(example) 或 System.Text.Json
),而不是硬编码字符串。
尝试使用 PostAsync 而不是 'PostAsJsonAsync'
var content = new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json");
var request = await httpClient.PostAsync(requestUrl, content);
请在
找到有关 'PostAsJsonAsync' 的更多详细信息答案就在这里。 Basic Auth的header的构造从一开始就是错误的。为了对其进行编码,我必须像这样 new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
传递它,因此传递给请求。
我还将 PostAsJsonAsync 替换为 PostAsync。它就像一个魅力!
最后,我得到一个状态代码 200 OK,其中包含我需要传递给我的视图的数据。
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;
}