AJAXを使用してRESTfulAPIと通信するリッチなWebクライアントを構築しています。クロスドメインブラウザの制限を回避するために、C#とASP.NETで非常に単純な(ただし偽の)HTTPプロキシを作成し、http://localhost上のクライアントアプリがhttp://restful.api.comと通信できるようにしました。
他の誰かがJavaで「適切な」プロキシを作成するので、私は最初は「シンプルに保つ」という任務を負いました。私の現在のバージョンは、文字列配列の値に基づいてURLとオプションのQueryStringを盲目的に作成する静的なASP.NET[WebMethod]です。
GET、POST、およびPUT操作の場合、System.Net.WebClient()のインスタンスを作成し、 client.downloadString(...)またはclient.UploadData(...)を呼び出します。このメソッドは文字列を返すため、RESTfulAPIによって返されるすべてのヘッダーと応答コードが失われます。
これは最初は問題ありませんでしたが、今度は本格的なプロキシに変換する必要があります。これは、ヘッダー、応答コード、ペイロードなど、実際のプロキシで取得できるものをすべて処理できます。
以下のコードスニペットを後付けすることは可能ですか、それとも最初から何かを書き直す必要がありますか?
WebMethodは次のとおりです。
[WebMethod]
public static string rest(string[] values, string[] queryStringParams, string verb, string jsonData)
{
string r = WebAppUtils.UnifiedMessagingApi(values, queryStringParams, verb, jsonData);
return r;
}
そして、これがワーカーメソッドです(GETとPOSTだけを示しています)。長さで申し訳ありませんが、私はこの質問のためにできるだけ多くの綿毛を取り除くようにしました。)
public static string UnifiedMessagingApi(string[] values, string[] queryStringParams, string verb, string jsonData)
{
var r = String.Empty;
var query = String.Format("{0}{1}", BaseUrl, String.Join("/", values));
if (queryStringParams.Length > 0)
{
var queryString = String.Join("&", queryStringParams);
query = query + "?" + queryString;
}
using (var client = new WebClient())
{
client.Encoding = Encoding.UTF8;
client.Headers.Add("Content-Type","application/json; charset=utf-8");
client.Proxy = null;
switch (verb)
{
case HttpVerb.GET:
try
{
r = client.DownloadString(query);
}
catch (WebException ex)
{
System.Diagnostics.Debug.WriteLine(ex.Status);
}
break;
case HttpVerb.POST:
try
{
var encoding = new System.Text.UTF8Encoding();
Byte[] data = encoding.GetBytes(jsonData);
// Call the REST API
Byte[] retValBytes = client.UploadData(query, verb, data);
// Convert the byte array to a string
r = System.Text.UTF8Encoding.Default.GetString(retValBytes);
}
catch (WebException ex)
{
System.Diagnostics.Debug.WriteLine(ex.Status);
}
break;
}
}
return r;
}
ありがとう!