다음 형식으로 내 RESTful API에 게시 요청이 전송됩니다.
헤더
Host: localhost:9475
Expect: 100-continue
Content-Type: application/json
Content-Length: 59
신체
{"query":"SOME STRING","variables":{"Foo":{"Data":"ABCD"}}}
요청 본문에서 데이터를 받으려고하므로 이것이 제가 시도한 것입니다.
public void foo(string query, object variables)
쿼리 매개 변수는 올바르게 구문 분석되고 있지만, 변수 매개 변수는 항상 얻는다 {object}
값으로.
public void foo(string query, Dictionary<string, object> variables)
쿼리 매개 변수가 올바르게 해석되지 않고 변수 매개 변수는 키 / 값으로 사전이다.
public void foo(string query, VariablesObj variables)
여기서 VariablesObj
public class VariablesObj
{
public object input_0 {get; set;}
}
쿼리 매개 변수를 정확하게 해석되는 상기 변수 파라미터는 하나의 속성 갖는다 INPUT_0 의 값을 {object}
.
내가 뭘 잘못하고 있니? 또는 이것이 작동하기 위해 구현해야 할 것이 누락 되었습니까?
편집 1 :
@rene의 답변을 시도했고이 시나리오에서 효과가 있었지만 이제 내 문제는 내부의 개체 Foo
가 클라이언트 측에서 Relay와 함께 GraphQl을 사용하는 것과 항상 같지 않고 변수를 보내야하는 개체로 변경한다는 것입니다. 그러나 일반적으로 내부에있는 하나의 개체입니다.
적절한 매핑을 얻으려면 문자열 유형의 공용 속성 데이터가있는 유형의 공용 속성 Foo가있는 클래스가 있는지 확인하십시오.
이것이 공용 인터페이스 인 경우
public void foo(string query, MyVars variables)
다음과 같은 수업이 필요합니다.
public class MyVars
{
public DataVars Foo { get; set; }
}
public class DataVars
{
public string Data { get; set;}
}
DataContractJsonSerializer로 빠르게 테스트 할 수 있습니다 .
var json = @"{""query"":""SOME STRING"",""variables"":{""Foo"":{""Data"":""ABCD""}}}";
var ser = new DataContractJsonSerializer(typeof(wrapper));
var sr = new MemoryStream(Encoding.UTF8.GetBytes(json));
var mv = (wrapper) ser.ReadObject(sr);
mv.Dump();
메서드 시그니처의 스탠드 인으로 하나의 추가 래퍼 유형을 추가합니다.
public class wrapper
{
public string query {get; set;}
public MyVars variables { get;set;}
}
LinqPad에서 실행하면 다음과 같은 결과가 나타납니다.
이것은 우리의 클래스 계층이 주어진 Json을 완전히 역 직렬화하는 데 정확하다는 것을 증명합니다.
변수가 모든 종류의 데이터 형태가 될 수있는 경우이를 포함하는 데 필요한만큼의 클래스를 정의하고 알려진 유형 목록을 사용하는 특수 생성자에이를 제공해야합니다 DataContractJsonSerializer Constructor (Type, IEnumerable<Type>)
. 이러한 클래스를 디자인하는 과정은 변경되지 않으며, 그 클래스 만 가질 수 있습니다. 데이터 KnownType
계약 클래스에 속성을 추가하십시오 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다