2017-12-06 40 views
0

"Flurl.Http"(버전 2.1.0) NuGet 패키지를 프로젝트에 추가 한 .NET Core 2.0 WebApi 응용 프로그램이 있습니다.Flurl에서 Content-Type을 변경하는 방법은 무엇입니까?

Flurl을 사용하여 Visual Studio Team Services (VSTS) API 끝점 중 하나에 대한 간단한 REST API 호출을 만들려고합니다.

그러나 VSTS API 엔드 포인트에서는 Content-Type을 일반적인 "application/json"대신 "application/json-patch + json"으로 설정해야합니다.

내 Flurl 호출에서 "WithHeader()"메서드를 사용하여 요청의 헤더에 Content-Type을 설정했지만 작동하지 않습니다. Flurl은 PostJsonAsync 메서드에 내장 된 기본 또는 표준 Content-Type을 재정의하도록 허용하지 않는 것으로 보입니다.

누군가 Flurl을 사용하여 요청의 Content-Type을 변경하는 방법을 알고 있습니까? 또는 Flurl 구성에서 Content-Type의 기본 동작을 올바르게 재정의하는 방법은 무엇입니까?

미리 감사드립니다.

내 코드 :

public bool CreateNewBug(NewBugRequest newBugRequest) 
{ 
    return _apiUrlToCreateNewBug.WithHeader("Authorization", "Basic Base64PersonalAccessTokenGoesHere") 
           .WithHeader("Content-Type", "application/json-patch+json") 
           .PostJsonAsync(newBugRequest.Fields) 
           .Result 
           .IsSuccessStatusCode; 
} 

(이 코드는 작동하지만 VSTS API의 응답이 콘텐츠 형식이 허용되지 않는 것입니다 및에 "응용 프로그램/JSON 패치 + JSON을 변경해야 ", 헤더에서 설정하려고 시도한 것입니다.)

+0

사람들이 태그를 채울 때 질문을 건너 뛰지 않도록 [태그는 무엇이며 어떻게 사용해야합니까?] (https://stackoverflow.com/help/tagging)를 읽어보십시오. – Tseng

답변

1

짧은 대답은 당신이 버그를 발견했다고 생각합니다. PostJsonAsync은 Content-Type 헤더를 설정하지만 이미 설정 한 경우 혼자 남겨 두어야한다고 생각합니다. 당신이 그것을보고 할 수 있다면 here 나는 다음 릴리스를 위해 그것을 고칠 수 있어야합니다.

해결 방법은 매우 간단합니다. 콘텐츠를 작성한 다음 PostJsonAsync 대신 PostAsync을 사용하여 게시하려면 몇 가지 추가 단계를 수행하기 만하면됩니다.

var json = FlurlHttp.GlobalSettings.JsonSerializer.Serialize(newBugRequest.Fields); 
var content = new CapturedStringContent(json, Encoding.UTF8, "application/json-patch+json"); 

return _apiUrlToCreateNewBug 
    .WithHeader("Authorization", "Basic Base64PersonalAccessTokenGoesHere") 
    .PostAsync(content); 

이 많이 할 필요가 있다면, 당신은 확장 메서드 (유사 PostJsonPatchAsync 나)에서 그것을 마무리 할 수 ​​있도록 당신이 유창하게 호출 할 수 있습니다. 이를 수행하는 올바른 방법은 here을 참조하십시오.

+0

정말 고마워요! 나는 매우 비슷한 것을 한 것을 끝내었고 그것을 알아낼 수 있었다.나는 곧 내가 한 일을 내 질문에 대한 대답으로 올릴 것이다. –

+0

https://github.com/tmenier/Flurl/issues/256 –

0

나는 그것을 알아낼 수 있었고 내 문제의 해결 방법을 찾을 수있었습니다. 여기

내 작업 코드의 업데이트 된 버전입니다 :

public HttpResponseMessage CreateNewBug(NewBugRequest newBugRequest) 
{ 
    return _apiUrlToCreateNewBug.AllowAnyHttpStatus() 
           .WithBasicAuth("", _personalAccessTokenForBasicAuth) 
           .PostAsync(new StringContent(JsonConvert.SerializeObject(newBugRequest.Fields), Encoding.UTF8, "application/json-patch+json")) 
           .Result; 
} 

PostAsync 방법은 HttpContent 객체에 걸립니다. HttpContent는 추상 클래스입니다. 일단 추상 클래스 인 HttpContent를 구현하는 모든 구체적인 클래스를 찾았 으면, 필자는 자신의 상황에 가장 잘 맞는 클래스를 선택하여 PostAsync 메소드에 연결했습니다.

이 경우 StringContent 클래스는 필자가 필요로하는 클래스에 가장 적합한 클래스입니다. StringContent의 생성자 중 하나는 해당 매개 변수 중 하나 인 Content-Type을 사용합니다. 그래서 나는 내 사용자 지정 Content-Type을 전달했으며 모든 것이 예상대로 작동했습니다.

+1

에 대한 문제점을 만들었습니다. 그 해결책은 다소 다릅니다. 가장 큰 차이점은 Flurl 객체'CapturedStringContent'를 사용한다는 것인데, 요청 본문에 대한 액세스 권한이 있기 때문에'FlurlHttpException'에서 더 나은 진단을 할 수 있고, 기본 JSON 검색 프로그램을 수정 한 경우'GlobalSettings'를 사용할 수 있습니다. –