我们在重定向API Http GET调用时遇到错误。我搜索了stackoverflow的类似问题,但它似乎不像我们的问题。
我们有一个简单的场景。我们的解决方案是后端,作为API调用的“网关”。
从我们的角度客户端,我们调用/ api / values,并且必须将其重定向到http://example.com:8080/api/values
。
所以我们采用了一个启动的.NET Core API项目,我们尝试从API控制器中简单地进行API客户端调用。
这是原始课程:
namespace WebApplication2.Controllers
{
[Route("api/[controller]")]
public class ValuesController : Controller
{
// GET api/values
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
}
}
然后我们将实际调用添加到我们的真实API中,如许多教程中所述。我们只想从API中返回我们的响应(请参阅下面的格式)。
// GET api/values
[HttpGet]
public async Task<String> Get()
{
string retValue = "";
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://example.com:8000");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = await client.GetAsync("/document/info/ab5846a1afe8ad12e46a4e60");
if (response.IsSuccessStatusCode)
{
retValue = await response.Content.ReadAsAsync<string>();
}
}
return retValue;
}
处理请求时发生未处理的异常。
JsonReaderException:解析时遇到意外的字符 价值:{。路径'',第2行,位置1. ReadStringValue
如果我使用此路线为我们的API做邮递员,结果如下:
{
"errorCode": 0,
"docId": "ab5846a1afe8ad12e46a4e60",
"status": 0
}
{
"version":{
"major":1,
"minor":1,
"build":-1,
"revision":-1,
"majorRevision":-1,
"minorRevision":-1
},
"content":{
"headers":[
{
"key":"Content-Length",
"value":[
"78"
]
},
{
"key":"Content-Type",
"value":[
"application/json"
]
}
]
},
"statusCode":200,
"reasonPhrase":"",
"headers":[
{
"key":"Date",
"value":[
"Fri, 06 Jan 2017 12:54:31 GMT"
]
}
],
"requestMessage":{
"version":{
"major":1,
"minor":1,
"build":-1,
"revision":-1,
"majorRevision":-1,
"minorRevision":-1
},
"content":null,
"method":{
"method":"GET"
},
"requestUri":"http://example.com:8000/document/info/ab5846a1afe8ad12e46a4e60",
"headers":[
{
"key":"Accept",
"value":[
"application/json"
]
}
],
"properties":{
}
},
"isSuccessStatusCode":true
}
答案 0 :(得分:2)
这一行是问题
retValue = await response.Content.ReadAsAsync<string>();
带有ReadAsAsync
参数的string
泛型方法基本上将HttpResponseMessage
遗忘为字符串。
改为使用ReadAsStringAsync
。
retValue = await response.Content.ReadAsStringAsync();
你应该得到理想的结果。
答案 1 :(得分:1)
好的,通过定义响应模型解决了问题。如
public class DocumentInfo
{
public int errorCode;
public string docId;
public int status;
}
然后键入如下:
var retValue = new DocumentInfo();
retValue = await response.Content.ReadAsAsync<DocumentInfo>();
并在方法上:
public async Task<DocumentInfo> Get()
有没有办法不强烈输入返回的结果?如果它从远程API更改(例如,如果他们添加了例如&#34;所有者&#34;属性),它将会中断?