2017-12-06 9 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エンドポイントでは、典型的な "application/json"の代わりにContent-Typeを "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からの応答は、Content-Typeが許可されていないことであり、「アプリケーション/ 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のコンストラクタの1つは、そのパラメータの1つとしてContent-Typeを取ります。だから私はカスタムのContent-Typeを渡して、すべてが期待通りに機能しました。

+1

それは多かれ少なかれ同じソリューションです。主な相違点は、Flurlオブジェクト 'CapturedStringContent'を使用して、リクエスト本体にアクセスできるため、' FlurlHttpException'からより良い診断を可能にし、デフォルトのJSON検索エンジンに微調整を行った場合に備えて 'GlobalSettings'を使用する点です。 –

関連する問題