2017-12-18 11 views
2

몇 가지 설명을 가져 오기 위해 Stack Exchange API에 대한 간단한 GET 요청을 만들고있는 콘솔 응용 프로그램을 만들었습니다. Flurl을 사용하고 있습니다.Flurl을 사용하여 StackExchange API에 GET 요청을 할 때 "예기치 않은 문자 예외"가 발생했습니다.

{"Unexpected character encountered while parsing value: \u001f. Path '', line 0, position 0."}

내가 행운과 같은 헤더를 설정 시도 :이 방법은 내가이 오류, Main

private static async Task GetComments() 
{ 
    dynamic d = await "https://api.stackexchange.com/2.2/comments?page=1&pagesize=5&order=desc&min=1513468800&max=1513555200&sort=creation&site=stackoverflow" 
         .GetJsonAsync(); 
} 

에서 호출에 불과하다.

dynamic d = await new Url("https://api.stackexchange.com/2.2/comments.....") 
       .WithHeader("Content-Encoding", "gzip") 
       .WithHeader("Accept-Encoding", "gzip") 
       .GetJsonAsync(); 

URL은 내가 open it in the browser

+0

아마도 flurl은 브라우저처럼 용서하지 않으므로 URL의 여분의 슬래시를 제거해야합니다. – Crowcoder

+0

@Crowcoder가 그것을 제거하고 시도했습니다. 작동하지 않음 : ( – adiga

+0

HttpClient와 같은 다른 API에서 작동합니까? – Crowcoder

답변

3

그래서이 Flurl가 상자 밖으로에서 Gzip을 지원하고 작업에 점점 마사지의 비트를 필요하지 않는 것 같다 때 적절한 JSON을 반환한다.

FlurlHttp.Configure(settings => { 
    settings.HttpClientFactory = new GzipClientFactory(); 
}); 

그리고 지금 Gzip 압축이 지원됩니다 :

dynamic d = await new Url("https://api.stackexchange.com/2.2/comments.....") 
       .GetJsonAsync(); 
+0

약간의 변경은'DefaultHttpClientFactory'에서 상속 받고'CreateMessageHandler' 만 재정의하는 것이 좋습니다. 구현을 약간 다듬을 수 있습니다. –

+0

최신 릴리스부터 이제는 기본적으로 지원됩니다. –

1

UPDATE : Flurl

public class GzipClientFactory : Flurl.Http.Configuration.IHttpClientFactory 
{ 
    public HttpMessageHandler CreateMessageHandler() => new HttpClientHandler() 
    { 
     AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate 
    }; 

    public HttpClient CreateHttpClient(HttpMessageHandler handler) => 
     new HttpClient(handler); 
} 

지금 Flurl이 사용하도록 구성 : 먼저 사용자 지정 HTTP 클라이언트 공장이 필요 .Http는 기본적으로 자동 압축 해제를 지원하므로 단지 upgrade이므로이 모든 것을 피할 수 있습니다. 이 api.stackexchange.com에 호출에 적용을 제외


는 여기에서 허용 대답 유사한 옵션이고, 그것은 더 많거나 적은 한 줄입니다. 시작시 한 번 전화 : 사이드 참고로

FlurlHttp.ConfigureClient("https://api.github.com", cli => 
    ((HttpClientHandler)cli.HttpMessageHandler).AutomaticDecompression = 
     DecompressionMethods.GZip | DecompressionMethods.Deflate); 

을 Flurl의 기본값은 정확히 자동 압축 해제의 측면에서 HttpClient를의 기본값과 동일합니다. 댓글에 GZIP이 HttpClient와 함께 작동하여 내 머리를 긁적 거리는 메모가 있지만 HttpClient에는 플랫폼/버전에 따라 differences이있는 것으로 보입니다. 더 쉽고 예측하기 쉽도록 Flurl에서 기본적으로 GZIP/DEFLATE를 지원할 생각이 있지만 우선 성능 등의 측면에서 그 의미를 이해해야합니다.

+0

좋아요, 이것도 시험해 보겠습니다. [이 질문] (https://stackoverflow.com/questions/27108264/c-sharp-how-to-properly-make-a-http-web-get-request)의 대답은'DecompressionMethods'를' HttpWebRequest'와'HttpClient'가 있습니다. 그러나 문제는 3 살입니다. – adiga

+0

'HttpWebRequest'는'HttpClient'의 전임자입니다 (사실상). Flurl은 후드에서'HttpClient'를 사용합니다.이 코드는 당신이 링크 한 질문에서'HttpClient' 답변과 실질적으로 똑같습니다.'HttpClientHandler'에 압축 해제 메소드를 설정합니다. –

1

Flurl.Http 2.2는 단지 released이었습니다. now automatically decompress GZIP and DEFLATE by default. 따라서 새로운 최상의 대답은 업그레이드입니다. :)

+0

이제 어떻게 작동하는지 보여줄 수 있습니까? 나는 그것이 미래의 독자들에게 도움이 될 것이라고 생각한다. –

+0

설명 할 내용이 전혀 없습니다. OP의 첫 번째 코드 샘플은 그대로 작동합니다. 오류가 없으며 구성 할 것도 없습니다. –

+0

좋아. 그러면 내 편이 다 괜찮아. –