consumir - httpclient post c#
¿Por qué HttpClient BaseAddress no funciona? (2)
La resolución de referencia está descrita por RFC 3986 Uniform Resource Identifier (URI): sintaxis genérica . Y así es exactamente como se supone que debe funcionar. Para conservar la ruta URI base, debe agregar una barra al final del URI base y eliminar la barra al comienzo del URI relativo.
Si el URI base contiene una ruta no vacía, el procedimiento de fusión descarta su última parte (después del último /
). section relevante:
5.2.3. Combinar rutas
El pseudocódigo anterior se refiere a una rutina de "fusión" para fusionar una referencia de ruta relativa con la ruta del URI base. Esto se consigue de la siguiente manera:
Si el URI base tiene un componente de autoridad definido y una ruta vacía, devuelva una cadena que consta de "/" concatenada con la ruta de la referencia; de otra manera
devolver una cadena compuesta por el componente de ruta de referencia anexado a todos menos al último segmento de la ruta del URI base (es decir, excluyendo cualquier carácter después del "/" más a la derecha en la ruta URI base o excluyendo toda la ruta URI base si no contiene ningún "/" caracteres).
Si el URI relativo comienza con una barra inclinada, se denomina URI relativo de ruta absoluta. En este caso, el procedimiento de fusión ignora toda la ruta URI base. Para más información, ver 5.2.2. Transformar la sección Referencias .
Considere el siguiente código, donde BaseAddress
define una ruta parcial de URI.
using (var handler = new HttpClientHandler())
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri("http://something.com/api");
var response = await client.GetAsync("/resource/7");
}
Espero que esto realice una solicitud GET
a http://something.com/api/resource/7
. Pero no es así
Después de algunas búsquedas, encuentro esta pregunta y respuesta: HttpClient con BaseAddress . La sugerencia es colocar /
en el extremo de BaseAddress
.
using (var handler = new HttpClientHandler())
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri("http://something.com/api/");
var response = await client.GetAsync("/resource/7");
}
Todavía no funciona. Aquí está la documentación: HttpClient.BaseAddress ¿Qué está pasando aquí?
Resulta que, de las cuatro permutaciones posibles de incluir o excluir barras inclinadas o adelantadas en BaseAddress
y el URI relativo pasado al método GetAsync
, o cualquier otro método de HttpClient
, solo funciona una permutación. Debe colocar una barra al final de BaseAddress
, y no debe colocar una barra al comienzo de su URI relativo, como en el siguiente ejemplo.
using (var handler = new HttpClientHandler())
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri("http://something.com/api/");
var response = await client.GetAsync("resource/7");
}
A pesar de que respondí mi propia pregunta, pensé que contribuiría la solución aquí ya que, nuevamente, este comportamiento antipático no está documentado. Mi colega y yo pasamos la mayor parte del día tratando de solucionar un problema que en última instancia fue causado por esta rareza de HttpClient
.