using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace UVC.Data.Http
{
///
/// HTTP 응답 문자열을 파싱하여 성공 여부를 확인하고 실제 데이터를 추출하는 규칙을 정의하는 클래스입니다.
///
///
/// 이 클래스는 주로 JSON 형식의 응답에서 특정 키 값을 기준으로 작업의 성공 여부를 판단하고,
/// 성공한 경우 데이터가 담긴 부분을 추출하는 데 사용됩니다.
///
public class HttpResponseMask
{
///
/// 응답에서 성공 여부를 나타내는 상태 메시지의 키 이름입니다. 기본값은 "message"입니다.
///
private string successKey = "message";
///
/// 응답에서 성공 상태를 나타내는 특정 값입니다. 이 값과 의 값이 일치하면 성공으로 간주합니다. 기본값은 "success"입니다.
///
private string successValue = "success";
///
/// 응답에서 실제 데이터 페이로드를 담고 있는 키 이름입니다. 기본값은 "data"입니다.
///
private string dataKey = "data";
///
/// 응답에서 성공 여부를 나타내는 상태 메시지의 키 이름을 가져옵니다.
///
public string SuccessKey => successKey;
///
/// 응답에서 성공 상태를 나타내는 특정 값을 가져옵니다.
///
public string SuccessValue => successValue;
///
/// 응답에서 실제 데이터 페이로드를 담고 있는 키 이름을 가져옵니다.
///
public string DataKey => dataKey;
///
/// 기본값("message", "success", "data")으로 클래스의 새 인스턴스를 초기화합니다.
///
public HttpResponseMask() { }
///
/// 지정된 키 값으로 클래스의 새 인스턴스를 초기화합니다.
///
/// 성공 여부 판단에 사용될 키 이름입니다.
/// 성공 상태를 나타내는 값입니다.
/// 실제 데이터가 포함된 키 이름입니다.
public HttpResponseMask(string successKey, string successValue, string dataKey)
{
this.successKey = successKey;
this.successValue = successValue;
this.dataKey = dataKey;
}
///
/// 제공된 HTTP 응답 문자열에 마스크 규칙을 적용하여 파싱 결과를 반환합니다.
///
/// 파싱할 HTTP 응답 문자열입니다. JSON 형식이어야 합니다.
///
/// 파싱 결과를 담고 있는 객체입니다.
/// 가 true이면, 에 추출된 데이터 문자열이 포함됩니다.
/// 가 false이면, 에 원본 응답 문자열이 포함될 수 있습니다.
///
///
/// 이 메서드는 먼저 응답 문자열을 로 파싱합니다.
/// 그 다음, 에 해당하는 토큰 값과 를 비교하여 (대소문자 구분 없이) 성공 여부를 판단합니다.
/// 성공한 경우, 에 해당하는 토큰의 문자열 값을 에 설정하고 를 true로 설정합니다.
/// 만약 에 해당하는 토큰 값과 를 비교하여 같지만 에 해당하는 토큰이 없거나 null인 경우에도 를 false로 설정합니다.
/// 실패한 경우, 원본 응답 문자열을 에 설정하고 를 false로 설정합니다.
///
public HttpResponseResult Apply(string response)
{
JObject responseObject = JObject.Parse(response);
if (responseObject.TryGetValue(successKey, out JToken? successToken) &&
responseObject.TryGetValue(dataKey, out JToken? dataToken) &&
successToken?.ToString().ToLower() == successValue.ToLower()) // successValue 비교 시에도 ToLower() 추가하여 일관성 유지
{
// 성공적인 응답 처리 로직
if (dataToken != null) return new HttpResponseResult(true, dataToken!.ToString(Formatting.None)); // 실제로는 dataKey에 해당하는 데이터만 반환할 수 있습니다.
}
return new HttpResponseResult(false, null, response); // 실패한 응답 처리 로직
}
}
}