如何将HttpClient用于OAuth2.0请求västrafikAPI

时间:2018-07-26 12:24:07

标签: c# swift dotnet-httpclient

如何在C#中使用HttpClient? 。我尝试实现此方法,但没有成功。我被困住了,并希望得到一些帮助:)

下面是一些正在运行的快速代码,以及随后的C#代码,它们显示了我尝试执行的操作。提前致谢。

生成令牌:

 POST https://api.vasttrafik.se/token HTTP/1.1
    Content-Type: application/x-www-form-urlencoded
    Authorization: Basic UmJseEkyeTFsWVNFTTZ0Z2J6anBTa2E0R1o6Wk1nSkR0Y0paRGV4OTJldUxpQUdYOFExUnU=
    grant_type=client_credentials&scope=<device_id>

快捷代码:

let data = ("\(Constants.key):\(Constants.secret)").data(using: String.Encoding.utf8)
    let base64 = data!.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0))

    let parameters = [
        "grant_type": "client_credentials",
        "scope": "\(UIDevice.current.identifierForVendor!.uuidString)"
    ]

    let headers = [
        "Authorization": "Basic \(base64)",
        "Content-Type": "application/x-www-form-urlencoded"
    ]

    if let expires = UserDefaults.standard.object(forKey: "expires") as? Date, let token = UserDefaults.standard.object(forKey: "token") as? String {
        if expires > Date() {
            completionHandler(token)
            return
        }
    }

    Alamofire.request(Constants.tokenURL, method: .post, parameters: parameters, encoding: URLEncoding.default, headers: headers)
        .responseJSON { response in
            if let json = response.result.value as? [String:Any] {
                if let token = json["access_token"] as? String, let expires = json["expires_in"] as? Int {
                    let date = Date()
                    let expiresTime = Calendar.current.date(byAdding: .second, value: expires, to: date)
                    UserDefaults.standard.set(expiresTime, forKey: "expires")
                    UserDefaults.standard.set(token, forKey: "token")
                    completionHandler(token)
                }
            }
    }

我尝试这样做,但没有成功。 C#代码:

            var client = new HttpClient();
            client.Timeout = new TimeSpan(0, 0, 10);
            var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(_nyckel + ":" + _hemlighet);
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", System.Convert.ToBase64String(plainTextBytes));
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));


            /*
             *  Connect to the server 
             */


            var strin = Injected.Instance.Platform.GetId();
            var base54 = System.Convert.ToBase64String(plainTextBytes);

            var stringContent = new FormUrlEncodedContent(new[]
            {
                new KeyValuePair<string, string>("grant_type", "client_credentials&scope=" + Injected.Instance.Platform.GetId())
            });

            HttpResponseMessage response = await client.PostAsync(page, stringContent);
            response.EnsureSuccessStatusCode();

1 个答案:

答案 0 :(得分:0)

我使用以下代码解决了它。

using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri("http://api.vasttrafik.se");
                var content = new FormUrlEncodedContent(new[]
                {
                    new KeyValuePair<string, string>("grant_type", "client_credentials"),
                    new KeyValuePair<string, string>("scope", Injected.Instance.Platform.GetId())
                });

                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", System.Convert.ToBase64String(plainTextBytes));

                content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
                var result = await client.PostAsync("token",content);
                string resultContent = await result.Content.ReadAsStringAsync();

            }