解析值

时间:2017-01-06 13:17:07

标签: c# asp.net-web-api asp.net-core .net-core dotnet-httpclient

上下文 - 我们的代码

我们在重定向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正常响应,简单的JSON

如果我使用此路线为我们的API做邮递员,结果如下:

{
  "errorCode": 0,
  "docId": "ab5846a1afe8ad12e46a4e60",
  "status": 0
}

.NET中的响应

{
   "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
}

2 个答案:

答案 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;属性),它将会中断?