私はAPIの呼び出し方法に関するPHPコード例を私に提供したサードパーティAPIを呼び出しています。私はPHPについては分かりませんが、同様の.NETソリューションを試してビルドするのはかなり簡単で見やすいものです。以下のPHPの例ではPostを実行していますが、C#の例でGetを実行します。私はいくつかのダミー値でPHPの例を嘲笑しました。ここでPHP API呼び出しサンプルコードをC#RestSharp Api呼び出しに変換するOAuth 1.0
$params = array();
$params['assertion_id'] = "b57936e4-6cea-46f4-a897-c7b3a6f01147"; // Example Assertion ID.
$params['product_id'] = "product001";
$params['product_name'] = "Useless Product";
$params['price'] = "1.99";
// Generate Signature Base String.
$params['api_key'] = "526587410g44p9kk8f7h2bb2zf3365va"; // Example Api Key.
$params['timestamp'] = "1510760624"; // Example Timestamp.
$params['nonce'] = "uilp37xh"; // Example Nonce.
ksort($params);
$url = "https://someurl.com/api/product";
$signature_base_string = 'POST&'.urlencode($url).'&'.http_build_query($params);
// Encrypt signature base string for signature.
$secret_key = "DlKST1adTpoWELS8TjjBc1pFATdlGA8qHUNEaq9MOSAUT648AlAvzK4EEC7="; // Example Secret Key.
$signature = base64_encode(hash_hmac('sha1', $signature_base_string, base64_decode($secret_key), true));
$params['signature'] = $signature;
// Send Request.
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, count($params));
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($curl);
curl_close($curl);
は私がRestSharpを利用し、これまで構築してきたC#のコード例です。ナンス、タイムスタンプ、および署名は、OAuth 1.0仕様に準拠していますが、正しく処理しているかどうかわかりません。私はApi呼び出しを実際にテストするために実際の値を提供することはできませんが、コードがサードパーティのApiからの応答を返すという意味で機能することを知っています。しかし、応答は、パラメータが不足していると述べています...
public class ProductApiRequest
{
private string _api;
private string _apiKey;
private string _apiSecretKey;
public ProductApiRequest()
{
_api = "https://someurl.com/api/";
_apiKey = "526587410g44p9kk8f7h2bb2zf3365va";
_apiSecretKey = "DlKST1adTpoWELS8TjjBc1pFATdlGA8qHUNEaq9MOSAUT648AlAvzK4EEC7=";
}
public class Product
{
public Guid assertion_id { get; set; }
public String api_key { get; set; }
public string product_id { get; set; }
public string product_name { get; set; }
public string price { get; set; }
public string timestamp { get; set; }
public string nonce { get; set; }
public string signature { get; set; }
}
public string getProduct()
{
try
{
Product oProduct = new Product();
oProduct.assertion_id = Guid.NewGuid();
oProduct.api_key = _apiKey;
oProduct.product_id = "product001";
oProduct.product_name = "Useless Product";
oProduct.price = "1.99";
oProduct.timestamp = GenerateTimeStamp();
oProduct.nonce = GenerateNonce();
oProduct.signature = GenerateSignature(oProduct.nonce, oProduct.timestamp, _apiSecretKey);
var path = "product";
dynamic request = new RestSharp.RestRequest(path, RestSharp.Method.GET);
request.RequestFormat = RestSharp.DataFormat.Json;
request.JsonSerializer = new RestSharp.Serializers.JsonSerializer();
request.AddJsonBody(oProduct);
var client = new RestSharp.RestClient(_api);
var response = client.Execute(request);
return "Return something.";
}
catch (Exception ex)
{
return ex.Message.ToString();
}
}
public string GenerateTimeStamp()
{
TimeSpan ts = DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1, 0, 0, 0, 0));
string timeStamp = ts.TotalSeconds.ToString();
timeStamp = timeStamp.Substring(0, timeStamp.IndexOf("."));
return timeStamp;
}
public string GenerateNonce()
{
var _random = new Random();
var sb = new StringBuilder();
for (int i = 0; i < 8; i++)
{
int g = _random.Next(3);
switch (g)
{
case 0:
// lowercase alpha
sb.Append((char)(_random.Next(26) + 97), 1);
break;
default:
// numeric digits
sb.Append((char)(_random.Next(10) + 48), 1);
break;
}
}
return sb.ToString();
}
public string GenerateSignature(string nonce, string timestamp, string apisecretkey)
{
var encoder = new UTF8Encoding();
var hasher = new System.Security.Cryptography.HMACSHA1();
var vals = string.Concat(nonce, timestamp, apisecretkey);
byte[] hashedDataBytes = hasher.ComputeHash(encoder.GetBytes(vals));
return Convert.ToBase64String(hashedDataBytes);
}
}
PHPソリューションをC#ソリューションに変換する助けがあれば幸いです!
「ダイナミック」は使用しないでください。 – SLaks
この例でPOSTを実行したときにGETを実行できますか?いくつかのAPIはPOSTを主張しています。 –
はい。提供された例は、POSTでした。 GETの他のAPIがあります。キャッチはテストのためだけのものでした。私はそれが最初に働くようにしたいと思うし、すべてを強化する。 –