2017-07-21 61 views
6

Używam listonosza i wysyłam prośbę o dodanie do aplikacji, w której dodajemy treść z kluczem/wartościami x-www-form-urlencoded i działa dobrze u listonosza.Żądanie postu RestSharp - Treść z wartościami x-www-urlen-kod

Problem pojawia się, gdy próbuję go z C# przy użyciu pakietu RestSharp.

Próbowałem poniższy kod, ale nie otrzymałem odpowiedzi. Otrzymuję błąd "BadRequest" invalid_client.

public class ClientConfig { 
    public string client_id { get; set; } = "value here"; 
    public string grant_type { get; set; } = "value here"; 
    public string client_secret { get; set; } = "value here"; 
    public string scope { get; set; } = "value here"; 
    public string response_type { get; set; } = "value here"; 
} 

public void GetResponse() { 
     var client = new RestClient("api-url-here"); 
     var req = new RestRequest("endpoint-here",Method.POST); 
     var config = new ClientConfig();//values to pass in request 

     req.AddHeader("Content-Type","application/x-www-form-urlencoded"); 
     req.AddParameter("application/x-www-form-urlencoded",config,ParameterType.RequestBody); 

     var res = client.Execute(req); 
     return; 
    } 

//Also tried this 

    req.AddParameter("client_id",config.client_id,"application/x-www-form-urlencoded",ParameterType.RequestBody); 
       req.AddParameter("grant_type",config.grant_type,"application/x-www-form-urlencoded",ParameterType.RequestBody); 
       req.AddParameter("client_secret",config.client_secret,"application/x-www-form-urlencoded",ParameterType.RequestBody); 
       req.AddParameter("scope",config.scope,ParameterType.RequestBody); 
       req.AddParameter("response_type",config.response_type,"application/x-www-form-urlencoded",ParameterType.RequestBody); 

//tried this too 
var client = new RestClient("url-here"); 
      var req = new RestRequest("endpointhere",Method.POST); 
      var config = new ClientConfig(); 
req.AddBody(config); 
var res = client.Execute(req); 
+0

sprawdzić moją odpowiedź, jeśli jest to pomocne dla Ciebie, jako znak zaakceptowanej odpowiedzi. : D –

Odpowiedz

4

to działa na mnie, to generator od listonosza

 var token = new TokenValidation() 
     { 
       app_id = CloudConfigurationManager.GetSetting("appId"), 
       secret = CloudConfigurationManager.GetSetting("secret"), 
       grant_type = CloudConfigurationManager.GetSetting("grant_type"), 
       Username = CloudConfigurationManager.GetSetting("Username"), 
       Password = CloudConfigurationManager.GetSetting("Password"), 
     }; 

     var client = new RestClient($"{xxx}{tokenEndPoint}"); 
     var request = new RestRequest(Method.POST); 
     request.AddHeader("content-type", "application/x-www-form-urlencoded"); 
     request.AddParameter("application/x-www-form-urlencoded", $"app_id={token.app_id}&secret={token.secret}&grant_type={token.grant_type}&Username={token.Username}&Password={token.Password}", ParameterType.RequestBody); 
     IRestResponse response = client.Execute(request); 

     if (response.StatusCode != HttpStatusCode.OK) 
     { 
      Console.WriteLine("Access Token cannot obtain, process terminate"); 
      return null; 
     } 

     var tokenResponse = JsonConvert.DeserializeObject<TokenValidationResponse>(response.Content); 
+0

Nie wydaje się, aby kodować parametry dotyczące cytatów itp. Wydaje się również, że dodaje on dodatkowy zestaw cytatów porównując go do listonosza. – John

+0

Metoda RestSharp.Extensions.StringExtensions.UrlEncode może kodować wartości przed wysłaniem ich w żądaniu. – hmadrigal