dotnet httpclient 공공포털 api 불러오기

안녕하세요. httpclient 로 공공포털 api를 불러오려고 합니다.

postman으로는 성공적으로 불러왔는데, 똑같이 dotnet httpclient를 사용해서 불러오면 자꾸 BadRequest가 돌아옵니다…
해당 API를 불러오려고 합니다: 국세청_사업자등록정보 진위확인 및 상태조회 서비스 | 공공데이터포털

코드:

public async Task<bool> Test(
            string bNum,
            string pName,
            string startDate,
            string bSector,
            string bType)
{
httpClient.BaseAddress = new Uri(_cfb.Host);
                var query = new Dictionary<string, string>
                {
                    ["serviceKey"] = _configuration["ServiceKey"]
                };
                var requestUri = QueryHelpers.AddQueryString(_cfb.ValidationUri, query!);
                var business = new Dictionary<string,string>
                {
                    ["b_no"] = bNum,
                    ["start_dt"] = startDate,
                    ["p_nm"] = pName,
                    ["b_sector"] = bSector,
                    ["b_type"] = bType
                };
                var data = new Dictionary<string, List<Dictionary<string,string>>>
                {
                    ["businesses"] = new List<Dictionary<string, string>>()
                    {
                        business
                    }
                };
                var jsonData = JsonConvert.SerializeObject(data);

                var content = new StringContent(jsonData, Encoding.UTF8, "application/json");
                var result = await httpClient.PostAsync(requestUri, content);
}

jsonData는 이렇게 나옵니다. ( 공공포털 swagger 또는 postman에서 보내지는 json과 같습니다. )
“{"businesses":[{"b_no":"1234","start_dt":"20210101","p_nm":"홍길동","b_sector":"서비스","b_type":"서비스"}]}”

Badrequset가 돌아오는 이유가 뭘까요 ㅜㅜ… 긴 글 읽어주셔서 감사합니다.

1개의 좋아요

인코딩된 serviceKey로 하니 저는 정상적으로 호출이 되는 걸 확인했습니다.

// See https://aka.ms/new-console-template for more information

using System.Net.Http;
using System.Text;
using Newtonsoft.Json;

var httpClient = new HttpClient();

var serviceKey = "인코딩된 serviceKey";
var serviceUrl= $"https://api.odcloud.kr/api/nts-businessman/v1/validate?serviceKey={serviceKey}";
    
var business = new Dictionary<string,string>
{
    ["b_no"] = "사업자번호",
    ["start_dt"] = "개업년월일",
    ["p_nm"] = "대표자명",
    ["b_sector"] = "",
    ["b_type"] = ""
};
var data = new Dictionary<string, List<Dictionary<string,string>>>
{
    ["businesses"] = new List<Dictionary<string, string>>()
    {
        business
    }
};
var jsonData = JsonConvert.SerializeObject(data);

var content = new StringContent(jsonData, Encoding.UTF8, "application/json");
var result = await httpClient.PostAsync(serviceUrl, content);
Console.WriteLine(await result.Content.ReadAsStringAsync());
4개의 좋아요

답변 감사합니다. 덕분에 문제 해결했습니다.
query. decode 문제였습니다. encoding한 걸 넣었는데, query로 넣으면 저절로 또 encode되더군요…
_jeonghwan님이 알려주신 방법으로 하면 바로 encoding된 query를 넣어도 되는데, 제가 한 방식으로 하면 query를 decode한 걸 넣어줘야 하더군요. 감사합니다.

3개의 좋아요