亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過WebApi返回JSON

通過WebApi返回JSON

C#
九州編程 2023-12-17 17:00:27
我正在使用 C# 中的 HttpClient 嘗試將 SSO(單點登錄)集成到我們的一些自定義應用程序中。我已經在我們的 JavaScript 應用程序中成功完成了此操作,但我在將其集成到我們的一些 Umbraco 網站中時遇到了一些困難。到目前為止我的代碼:using System;using System.Threading.Tasks;using System.Net.Http;using System.Net.Http.Headers;using System.Web;using System.Web.Http;using Newtonsoft.Json;using System.Collections.Generic;using Umbraco.Web;using Umbraco.Web.WebApi;namespace Umbraco.WebApi{  public class TestController : UmbracoApiController  {    public  HttpClient client = new HttpClient();    [HttpPost]    public async Task<Object> GetRefreshToken(Token t)    {      try {        string refToken = t.refresh_token;        var values = new Dictionary<string, string>        {          { "grant_type", "refresh_token" },          { "client_id", "CLIENTID" },          { "client_secret", "CLIENTSECRET" },          { "refresh_token", refToken }        };        var content = new FormUrlEncodedContent(values);                var response = await client.PostAsync("https://URL.org/Token", content);        string responseString = await response.Content.ReadAsStringAsync();        return responseString;      } catch(HttpRequestException e) {        return e;      }    }    public class Token    {      public string refresh_token { get; set; }    }    public class AuthData    {      public string access_token { get; set; }      public string token_type { get; set; }      public int expires_int { get; set; }      public string refresh_token { get; set; }      public string userName { get; set; }      public string client_id { get; set; }      public DateTime issued { get; set; }      public DateTime expires { get; set; }    }  }}它確實成功返回了我想要的數據,但返回的數據存在問題(刪除了敏感數據):<z:anyType xmlns:d1p1="http://www.w3.org/2001/XMLSchema" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/" i:type="d1p1:string"></z:anyType>它似乎也以 XML 而不是 JSON 的形式返回?C# 不是我最擅長的語言,所以我可能完全錯了。
查看完整描述

3 回答

?
catspeake

TA貢獻1111條經驗 獲得超0個贊

在您的代碼中,獲取 JSON 字符串后responseString,不要返回它,而是嘗試以下代碼。


...

string responseString = await response.Content.ReadAsStringAsync();

response = Request.CreateResponse(HttpStatusCode.OK);

response.Content = new StringContent(responseString, Encoding.UTF8, "application/json");

return response;

您需要將方法返回值從 Task<Object> 更改為 Task<HttpResponseMessage>


編輯:


要訪問屬性,請安裝 Newtonsoft.Json 包并嘗試以下代碼。


var jsonString = ...

JObject jo = JObject.Parse(jsonString);

Console.WriteLine(jo["access_token"]);


查看完整回答
反對 回復 2023-12-17
?
浮云間

TA貢獻1829條經驗 獲得超4個贊

要解決此問題,您可以執行的操作之一是通過添加正確的請求標頭來專門請求響應中的 json 格式

Accept:?application/json

像這樣嘗試一下

client.DefaultRequestHeaders.Accept.Add(new?MediaTypeWithQualityHeaderValue("application/json"));

現在,如果服務器關注請求標頭,它將返回一個 json 給您。 它可能默認為 xml,因為您的請求中沒有此類標頭,或者服務器僅支持返回 xml 響應。

編輯:如果您無法讓服務器返回 json,您可以將 xml 字符串響應轉換為 json 字符串。轉換后,您可以從控制器正常返回 json 字符串。

編輯:

好的,嘗試下面的示例:

var content = new FormUrlEncodedContent(new[]

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? new KeyValuePair<string, string>("client_id", ""),

? ? ? ? ? ? ? ? new KeyValuePair<string, string>("scope", ""),

? ? ? ? ? ? ? ? new KeyValuePair<string, string>("grant_type", "authorization_code"),

? ? ? ? ? ? ? ? new KeyValuePair<string, string>("redirect_uri", ""),

? ? ? ? ? ? ? ? new KeyValuePair<string, string>("code", ""),

? ? ? ? ? ? ? ? new KeyValuePair<string, string>("client_secret","")

? ? ? ? ? ? });


? ? ? ? ? ? AADTokenResponse TokenResponse = null;

? ? ? ? ? ? string _baseAddress = string.Format("https://yourTargetDomain.com/");


? ? ? ? ? ? using (var client = new HttpClient())

? ? ? ? ? ? {

? ? ? ? ? ? ? ? client.BaseAddress = new Uri(_baseAddress);

? ? ? ? ? ? ? ? client.DefaultRequestHeaders.Accept.Clear();

? ? ? ? ? ? ? ? client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));


? ? ? ? ? ? ? ? var responseMessage = await client.PostAsync("targetApiSegment", content);


? ? ? ? ? ? ? ? if (responseMessage.IsSuccessStatusCode)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? var responseString = await responseMessage.Content.ReadAsStringAsync();

? ? ? ? ? ? ? ? ? ? TokenResponse = JsonConvert.DeserializeObject<AADTokenResponse>(responseString);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }


查看完整回答
反對 回復 2023-12-17
?
米脂

TA貢獻1836條經驗 獲得超3個贊

我認為在這種情況下,FormUrlEncodedContent是錯誤的選擇,你應該使用StringContent,類似于:< /span>

var content = new StringContent(HttpUtility.UrlEncode(values), Encoding.UTF8, "application/json");
var response = await client.PostAsync("https://URL.com/Token", content);

原因是,我認為 FormUrlEncodeContent 沒有重載來接受添加內容類型。

另一種替代方法是改用 SendAsync 而不是 PostAsync,因為 SendAsync 具有一些額外的靈活性。


查看完整回答
反對 回復 2023-12-17
  • 3 回答
  • 0 關注
  • 229 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號