HttpClient post returns c# 中的错误请求,在 postman 中有效
HttpClient post returns bad request in c#, works in postman
我正在尝试访问休息端点,https://api.planet.com/auth/v1/experimental/public/users/authenticate。它在请求正文中期待 json。
我可以得到在 Postman 中工作的请求,但不能使用 c#。使用邮递员,我得到了预期的无效电子邮件或密码消息,但是无论我尝试什么,我的代码都得到 "Bad Request"。
这是发出请求的代码
private void Login()
{
try
{
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("https://api.planet.com/");
client.DefaultRequestHeaders.Accept.Clear();
//ClientDefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));
Data.User user = new Data.User
{
email = "myemail@company.com",
password = "sdosadf"
};
var requestMessage = JsonConvert.SerializeObject(user);
var content = new StringContent(requestMessage, Encoding.UTF8, "application/json");
var response = client.PostAsync("auth/v1/experimental/public/users/authenticate", content).Result;
Console.WriteLine(response.ToString());
}
catch (WebException wex )
{
MessageBox.Show(wex.Message) ;
}
}
class User
{
public string email;
public string password;
}
这是来自 Postman 的正在运行的屏幕截图
问题是您正在尝试调用 async
方法而不等待使用 await method
或 var task = method; task.Wait()
的响应因此,当您最终执行 response.ToString()
时returns 您看到的文字。
在 non-async 方法中处理此问题的一种方法是执行以下操作:
var task = client.PostAsync("auth/v1/experimental/public/users/authenticate", content);
task.Wait();
var responseTask = task.Content.ReadAsStringAsync();
responseTask.Wait();
Console.WriteLine(responseTask.Result);
另一种方法是通过执行 private async void Login()
使当前方法异步,然后执行:
var postResp = await client.PostAsync("auth/v1/experimental/public/users/authenticate", content);
var response = await postResp.Content.ReadAsStringAsync();
Console.WriteLine(response);
实现此功能的方法是更改内容 header "content-type"。默认情况下 HTTPClient
正在创建 content-type: application/json;characterset= UTF8
。我删除并重新创建了没有字符集部分的内容 header,它起作用了。
content.Headers.Remove("Content-Type");
content.Headers.Add("Content-Type", "application/json");
像这样创建一个方法...
static async Task<string> PostURI(Uri u, HttpContent c)
{
var response = string.Empty;
var msg = "";
using (var client = new HttpClient())
{
HttpResponseMessage result = await client.PostAsync(u, c);
msg = await result.Content.ReadAsStringAsync();
if (result.IsSuccessStatusCode)
{
response = result.StatusCode.ToString();
}
}
return response;
}
调用你的方法
public void Login()
{
string postData ="{\"email\":\"your_email\",\"password\":\"your_password\"}";
Uri u = new Uri("yoururl");
var payload = postData;
HttpContent c = new StringContent(payload, Encoding.UTF8,"application/json");
var t = Task.Run(() => PostURI(u, c));
t.Wait();
Response.Write(t.Result);
}
我正在尝试访问休息端点,https://api.planet.com/auth/v1/experimental/public/users/authenticate。它在请求正文中期待 json。
我可以得到在 Postman 中工作的请求,但不能使用 c#。使用邮递员,我得到了预期的无效电子邮件或密码消息,但是无论我尝试什么,我的代码都得到 "Bad Request"。
这是发出请求的代码
private void Login()
{
try
{
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("https://api.planet.com/");
client.DefaultRequestHeaders.Accept.Clear();
//ClientDefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));
Data.User user = new Data.User
{
email = "myemail@company.com",
password = "sdosadf"
};
var requestMessage = JsonConvert.SerializeObject(user);
var content = new StringContent(requestMessage, Encoding.UTF8, "application/json");
var response = client.PostAsync("auth/v1/experimental/public/users/authenticate", content).Result;
Console.WriteLine(response.ToString());
}
catch (WebException wex )
{
MessageBox.Show(wex.Message) ;
}
}
class User
{
public string email;
public string password;
}
这是来自 Postman 的正在运行的屏幕截图
问题是您正在尝试调用 async
方法而不等待使用 await method
或 var task = method; task.Wait()
的响应因此,当您最终执行 response.ToString()
时returns 您看到的文字。
在 non-async 方法中处理此问题的一种方法是执行以下操作:
var task = client.PostAsync("auth/v1/experimental/public/users/authenticate", content);
task.Wait();
var responseTask = task.Content.ReadAsStringAsync();
responseTask.Wait();
Console.WriteLine(responseTask.Result);
另一种方法是通过执行 private async void Login()
使当前方法异步,然后执行:
var postResp = await client.PostAsync("auth/v1/experimental/public/users/authenticate", content);
var response = await postResp.Content.ReadAsStringAsync();
Console.WriteLine(response);
实现此功能的方法是更改内容 header "content-type"。默认情况下 HTTPClient
正在创建 content-type: application/json;characterset= UTF8
。我删除并重新创建了没有字符集部分的内容 header,它起作用了。
content.Headers.Remove("Content-Type");
content.Headers.Add("Content-Type", "application/json");
像这样创建一个方法...
static async Task<string> PostURI(Uri u, HttpContent c)
{
var response = string.Empty;
var msg = "";
using (var client = new HttpClient())
{
HttpResponseMessage result = await client.PostAsync(u, c);
msg = await result.Content.ReadAsStringAsync();
if (result.IsSuccessStatusCode)
{
response = result.StatusCode.ToString();
}
}
return response;
}
调用你的方法
public void Login()
{
string postData ="{\"email\":\"your_email\",\"password\":\"your_password\"}";
Uri u = new Uri("yoururl");
var payload = postData;
HttpContent c = new StringContent(payload, Encoding.UTF8,"application/json");
var t = Task.Run(() => PostURI(u, c));
t.Wait();
Response.Write(t.Result);
}