为什么HttpClient在发布请求中使用了不正确的requestUri?

时间:2018-08-26 10:43:51

标签: c# httprequest httpclient

当我使用HttpClient类将POST请求发送到API URL时,它会修改我传递给它的URL。例如,当我使用主API URL时,RequestUri不正确,并且收到未找到的响应。当我在URL中使用api字时会发生此问题!

概念:

The Incorrect, modified URL:

Url: https://sandbox-api.alopeyk.com/api/v2/order 
Request Url: https://sandbox-api.alopeyk.com

The Correct, and expected URL (This is the one I specify)

Url: https://google.com/api/v2/order
Request Url: https://google.com/api/v2/order

代码:

public async Task<CreateOrderResponse> CreateOrderAsync(CreateOrderRequest request)
{
     var endPoint = EndPointFactory<CreateOrderResponse>.Build(HttpMethod.Post);

    var jsonString = JsonConvert.SerializeObject(request);

    var url = new Uri("https://sandbox-api.alopeyk.com");

    var encodedFrom = new StringContent(jsonString);

    var httpClient = endPoint.GetHttpClient(url);

    var httpResponse = await httpClient.PostAsync("api/v2/orders", encodedFrom).ConfigureAwait(false);

    // when use api it's https://sandbox-api.alopeyk.com it should be https://sandbox-api.alopeyk.com/api/v2/orders
    // when use other host name for example it's correct
    var requesturl = httpResponse.RequestMessage.RequestUri;

    return await httpResponse.Content.ReadAsAsync<CreateOrderResponse>().ConfigureAwait(false);
}

 // in the EndPoint class
 public HttpClient GetHttpClient(Uri url)
 {
     return new Http.HttpClientFactory().GetOrCreate(Url, Headers);
 }

如果您想看到HttpClientFactory,那就是here

HttpClient的主要主机名是https://sandbox-api.alopeyk.com

3 个答案:

答案 0 :(得分:1)

您的Uri必须以这样的斜杠结尾:

  var url = new Uri("https://sandbox-api.alopeyk.com/");

这是对HttpClient的愚蠢限制。

答案 1 :(得分:1)

尝试以下代码:

 HttpClient client = new HttpClient();
   client.BaseAddress = new Uri("https://sandbox-api.alopeyk.com");
   HttpResponseMessage response = client.PostAsync("api/v2/orders", new StringContent(jsonString, Encoding.UTF8, "text/json")).Result;  
                if (response.IsSuccessStatusCode)
                {
                    // Parse the response body. Blocking!
                   var  responseData = response.Content.ReadAsStringAsync().Result;                    

                }

答案 2 :(得分:0)

您可以尝试使用此代码

HttpResponseMessage response = null;
            using (var client = new HttpClient())
            {
                using (var request = new HttpRequestMessage(HttpMethod.Post,"https://sandbox-api.alopeyk.com/api/v2/orders"))
                {
                    request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                    request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", /*token herer*/);
                    var data = new StringContent(JsonConvert.SerializeObject(request, Encoding.UTF8, "application/json"));
request.Content = data;
                    response = await client.SendAsync(request);
                }
            }