【问题标题】:How to POST JSon with a Bearer Token如何使用不记名令牌发布 JSON
【发布时间】:2019-08-24 14:19:45
【问题描述】:

我可以使用类似的代码和不记名令牌执行 GET,但似乎无法执行 POST。

当我将 Json、URL 和承载令牌复制/粘贴到 Postman 中时,它可以完美运行。但是从 C# 执行此操作时,我收到此错误:

“状态代码:400,ReasonPhrase:'错误请求',版本:1.1,内容: System.Net.Http.StreamContent,标头:{ 传输编码:分块 连接:保持活动期望-CT:max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" CF-RAY:4c190ad8ad786539-SYD 日期:2019 年 4 月 3 日星期三 06:38:54 GMT 设置 Cookie:__cfduid=dc0232e99fa0fefc0bd728258229dd5d51554273534; 过期=周四,20 年 4 月 2 日 06:38:54 GMT;路径=/;域=.paymentsapi.io; 仅http;安全服务器:cloudflare X-Powered-By:ASP.NET 内容类型:应用程序/json;字符集=utf-8 }"

谁能看到我做错了什么?

提前致谢。

JsonSerializerSettings jss = new JsonSerializerSettings();
string strValue = JsonConvert.SerializeObject(TestMaster, jss);
lblJSon.Text = strValue;        // This Json is valid
ByteArrayContent bytecontent = new ByteArrayContent(System.Text.Encoding.UTF8.GetBytes(strValue));
bytecontent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

string AccessToken = lblToken.Text;

HttpClient tRequest = new HttpClient();
tRequest.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken);

Task<HttpResponseMessage> getTask = tRequest.PostAsJsonAsync(new Uri(strURL).ToString(), bytecontent);

HttpResponseMessage urlContents = await getTask;

Console.WriteLine("urlContents.ToString");
lblEDDR.Text = urlContents.ToString();

【问题讨论】:

  • 可能是因为“System.Text.Encoding.UTF8.GetBytes”,尝试使用System.Convert.FromBase64String

标签: c# json api post bearer-token


【解决方案1】:

PostAsJsonAsync 将您的 ByteArrayContent 转换为 json 对象。你可以像这样直接使用 ether PostAsJsonAsyncTestMaster

string AccessToken = lblToken.Text;

HttpClient tRequest = new HttpClient();
tRequest.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken);

Task<HttpResponseMessage> getTask = tRequest.PostAsJsonAsync(new Uri(strURL).ToString(), TestMaster);

HttpResponseMessage urlContents = await getTask;

Console.WriteLine("urlContents.ToString");
lblEDDR.Text = urlContents.ToString();

或者您将TestMaster 转换为Json 并将PostAsyncStringContent 对象一起使用。像这样:

JsonSerializerSettings jss = new JsonSerializerSettings();
string strValue = JsonConvert.SerializeObject(TestMaster, jss);
lblJSon.Text = strValue;        // This Json is valid
StringContent strcontent = new StringContent (strValue);
bytecontent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

string AccessToken = lblToken.Text;

HttpClient tRequest = new HttpClient();
tRequest.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken);

Task<HttpResponseMessage> getTask = tRequest.PostAsync(new Uri(strURL).ToString(), bytecontent);

HttpResponseMessage urlContents = await getTask;

Console.WriteLine("urlContents.ToString");
lblEDDR.Text = urlContents.ToString();

【讨论】:

  • 感谢@Rain336 ... 现在出现此错误:- StatusCode:201,ReasonPhrase:'Created',版本:1.1,内容:System.Net.Http.StreamContent,标题:{ Transfer-Encoding : 分块连接: keep-alive Expect-CT: max-age=604800, report-uri="rep..lare.com/cdn-cgi/beacon/expect-ct" CF-RAY: 4c193cf0689219aa-SYD 日期: 2019 年 4 月 3 日星期三 07:13:06 GMT 位置: @987654322 @Server: cloudflare X-Powered-By: ASP.NET Content-Type: application/json; charset=utf-8 }(截断)
  • 这不是错误消息。服务器响应状态码201 Created,表示请求成功。
  • 哦...大声笑...你能告诉我我是新手吗?希望最后一个问题......我如何获得响应正文?在邮递员中,我得到了一个 JSon 字符串。我在调试模式下查看了 urlContents,但看不到。
  • urlContents.Content.ReadAsStringAsync()HttpResponseMessage 读取为字符串。还有其他处理二进制响应的方法。它也是一个异步方法,所以你需要在上面使用await
猜你喜欢
  • 2019-02-20
  • 2023-03-18
  • 2017-04-20
  • 2021-08-05
  • 2020-03-19
  • 2014-09-04
  • 2016-11-20
  • 1970-01-01
  • 2019-08-14
相关资源
最近更新 更多