2017-10-23 2 views
0

Ich bin noch sehr neu zu Rest Sharp und Postman, aber ich versuche, ein "Update" zu einem bestehenden Benutzer zu machen. Hier ist mein Code, aber ich weiß es falsch. Hat jemand Beispiele, wie man in Rest Sharp eine "Ersetzen" -Operation durchführt?Rest Sharp Patch Anfrage

string url = _EndPoint + "?_action = patch & _queryId =for-userName & uid =" + obj.userName.ToString(); 
      var client = new RestClient(url); 
      var request = new RestRequest(Method.POST); 
      string username = "openidm-admin"; 
      string password = "openidm-admin"; 
      string svcCredentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(username + ":" + password)); 
      string Update = BuildUpdate(); 

      //if (Update != null) 
      //{ 
      request.AddHeader("Authorization", "Basic " + svcCredentials); 
      request.AddHeader("content-type", "application/json"); 
      //request.AddParameter("application/json", "[\n {\n \"operation\": \"replace\",\n \"field\": \"/userName\",\n \"value\": \"[email protected]\"\n },\n {\n \"operation\": \"replace\",\n \"field\": \"/mail\",\n \"value\": \"[email protected]\"\n }\n]", ParameterType.RequestBody); 
      request.AddBody({ "operation": "replace", "field": "/userName", "value": "[email protected]"}, { "operation": "replace", "field": "/mail", "value": "[email protected]"}); 
      IRestResponse response = client.Execute(request); 

Postman sagt, es ist so etwas wie dies sein sollte:

[ 
    { 
    "operation": "replace", 
    "field": "/userName", 
    "value": "[email protected]" 
    }, 
    { 
    "operation": "replace", 
    "field": "/mail", 
    "value": "[email protected]" 
    } 
] 

Ich würde es vorziehen, es so zu schreiben, aber ich habe keine Ahnung wie. Der andere Code schlug vor, dass ich eine Zeichenfolge mache. Ich kann es über eine Schnur ausschreiben, aber ich bevorzuge es, es in den Körper zu schreiben, wenn ich kann oder möglich. Vielen Dank im Voraus

Edit:

Hier ist meine Klasse:

public class IdentityDetails 
    { 
     //public const string type = "user"; 
     //public const string realm = "dc=aha,dc=org";   
     public string userName { get; set; } 
     public string mail { get; set; } 
     public string givenName { get; set; } 
     public string sn { get; set; } 
     public string accountStatus { get; set; } 
     public string avectraId { get; set; } 
     public string AHApw { get; set; } 
     public string password { get; set; } 
     public string ahaBirthYear { get; set; } 
     public string city { get; set; } 
     public string ahaGender { get; set; } 
     public string ahaJobTitle { get; set; } 
     public string ahaLeadScore { get; set; } 
     public string stateProvince { get; set; } 
     public string orgId { get; set; } 
     public string[] ahaMemberGroup { get; set; } 
     public string[] ahaMemberType { get; set; } 
     public string regMethod { get; set; } 
     //public string[] ahaDrupalPermission { get; set; } 
    } 

Ich denke, was ich auch tun müssen, obwohl im aktuellen Feld und Wert übergeben wird, und übergeben der neue Wert für das Feld Ich bin nur auf der Suche nach einem Beispielcode von jemand anderem, der eine Updateanforderung mit Restsharp ausführt. Ich könnte alles in einer Zeichenfolge schreiben, aber ich hoffe auf einen einfacheren Weg als mit einem String und der Übergabe als Parameter.

bearbeiten

ich zur Zeit versucht, es zu tun, indem Sie einen String Aufbau als Parameter übergeben in. Ich weiß, dass es einen besseren Weg geben muss. Hier ist mein aktueller Fortschritt beim Aufbau einer Saite;

Postman String:

request.AddParameter("application/javascript", "[\n {\n \"operation\": \"replace\",\n \"field\": \"/userName\",\n \"value\": \"[email protected]\"\n },\n {\n \"operation\": \"replace\",\n \"field\": \"/mail\",\n \"value\": \"[email protected]\"\n }\n]", ParameterType.RequestBody); 

Meine String-Builder-Funktion in progress:

private string BuildUpdate(string field, string newvalue, string oldvalue) 
     { 
      try 
      { 
       string Update = string.Empty; 
       string UpdateOperation = '"' + "operation" + '"' + ": " + '"' + "replace\"" + ",\n" + '"'; 
       string Updatefield = "field" + '"' + ": \""; 
       string UpdateNewValue = "/" + newvalue + '"' + ",\n"; 
       string 

       // "[\n {\n \"operation\": \"replace\",\n\" 
       // field\": \" 
       // /userName\",\n  
       // \"value\": \"[email protected]\"\n },\n {\n \"operation\": \"replace\",\n \"field\": \"/mail\",\n \"value\": \"[email protected]\"\n }\n]" 

       return Update; 
      } 
      catch(Exception ex) 
      { 
       return null; 
      } 
     } 

Wer einen besseren Weg, dies zu tun?

+0

Ich glaube, Sie können eine Klasse erstellen und AddBody verwenden, um das bestimmte Objekt dieser Klasse zu serialisieren, was Ihr Problem vereinfachen sollte. –

+0

Ihr Körper sollte ein Array sein. 'request.AddBody (new [] {....})' – Amy

+0

Haben Sie ein Code-Snippet, das Sie teilen können, wenn Sie einen Wert aktualisieren und ersetzen? – mholmes3038

Antwort

0

Ich denke, dass ich die Antwort auf mein Problem gefunden. Ich bin nicht sicher, ob ich das in der richtigen Reihenfolge habe, aber ich habe die Zeichenfolge korrekt formatiert. Ich hoffe, das hilft auch anderen.

Hier ist meine Basis-Funktion für meine REST Aktualisierungsanforderung Durchführung Restsharp mit:

public string UpdateRequest(string uid, string field, string newvalue, string oldvalue) 
     { 
      try 
      { 
       string url = _EndPoint + "?_action = patch & _queryId =for-userName & uid =" + uid; 
       var client = new RestClient(url); 
       var request = new RestRequest(Method.POST); 
       string username = "openidm-admin"; 
       string password = "openidm-admin"; 
       string svcCredentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(username + ":" + password)); 
       string Update = BuildUpdate(field, newvalue, oldvalue); 

       if (Update != null) 
       { 
        request.AddHeader("Authorization", "Basic " + svcCredentials); 
        request.AddHeader("content-type", "application/json"); 
        request.AddParameter("application/json", Update, ParameterType.RequestBody); 
        IRestResponse response = client.Execute(request); 

        return response.Content.ToString(); 
       } 
       else 
       { 
        //Error 
        return "Error"; 
       } 
      } 
      catch (Exception ex) 
      { 
       return ex.ToString(); 
      } 
     } 

ich meine BuildUpdate Funktion ruft meine Json Zeichenfolge zurückzugeben, die ich weitergeben in als meine Parameter verwenden. Hier ist meine Funktion zum Erstellen der Update-Zeichenfolge. Ich habe es in zwei Teile aufgeteilt und jedes Teil in ein JSON-String-Format umgewandelt. Dann kombiniere ich sie in eine einzige Saite:

private string BuildUpdate(string field, string newvalue, string oldvalue) 
     { 
      try 
      { 
       //Parameter String 
       string Update = string.Empty; 

       //New Value 
       var dict1 = new Dictionary<string, string>(); 
       dict1.Add("operation", "replace"); 
       dict1.Add("field", field); 
       dict1.Add("value", newvalue); 
       string json1 = Regex.Unescape(JsonConvert.SerializeObject(dict1, Newtonsoft.Json.Formatting.Indented)); 

       //Current Value 
       var dict2 = new Dictionary<string, string>(); 
       dict2.Add("operation", "replace"); 
       dict2.Add("field", field); 
       dict2.Add("value", oldvalue); 
       string json2 = Regex.Unescape(JsonConvert.SerializeObject(dict2, Newtonsoft.Json.Formatting.Indented)); 

       Update = json1 + ",\n " + json2; 

       return Update; 
      } 
      catch(Exception ex) 
      { 
       return null; 
      } 
     } 

Hier ist meine Ausgabe-String ist, werde ich als meine Parameter übergibt in:

"{\r\n \"operation\": \"replace\",\r\n \"field\": \"userName\",\r\n \"value\": \"[email protected]\"\r\n},\n {\r\n \"operation\": \"replace\",\r\n \"field\": \"userName\",\r\n \"value\": \"[email protected]\"\r\n}" 

Update: Ich wollte nur mit jedem meinen Arbeitsbeispielcode teilen .

Funktion 1:

public string UpdateRequest(string uid, string field, string value) 
     { 
      try 
      { 
       string url = _EndPoint + "?_action=patch&_queryId=for-userName&uid=" + uid; 
       var client = new RestClient(url); 
       var request = new RestRequest(Method.POST); 
       string username = "openidm-admin"; 
       string password = "openidm-admin"; 
       string svcCredentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(username + ":" + password)); 
       string Update = BuildUpdate(field, value); 

       if (Update != null) 
       { 
        request.AddHeader("Authorization", "Basic " + svcCredentials); 
        request.AddHeader("content-type", "application/json"); 
        request.AddParameter("application/json", Update, ParameterType.RequestBody); 
        IRestResponse response = client.Execute(request); 

        return response.Content.ToString(); 
       } 
       else 
       { 
        //Error 
        return "Error"; 
       } 
      } 
      catch (Exception ex) 
      { 
       return ex.ToString(); 
      } 
     } 

Hier ist die String Gebäude Funktion Ihres JSON-String für die Anforderung zu bauen:

private string BuildUpdate(string field, string value) 
     { 
      try 
      { 
       //Parameter String 
       string json = string.Empty; 

       //Value 
       var dict = new Dictionary<string, string>(); 
       dict.Add("operation", "replace"); 
       dict.Add("field", field); 
       dict.Add("value", value); 
       json = "[\n" + Regex.Unescape(JsonConvert.SerializeObject(dict, Newtonsoft.Json.Formatting.Indented)) + "\n]"; 

       return json; 
      } 
      catch(Exception ex) 
      { 
       return null; 
      } 
     } 

Ich bin mir nicht sicher, warum ich hinzufügen müssen „[\ n "oder" \ n) ", aber ich nehme an, dass es aus irgendeinem Grund eingewickelt ist. Wie auch immer, ich hoffe, das hilft jemandem.

+0

Ich denke, ich könnte ein wenig falsch sein auf meine Antwort. Ich brauche vielleicht nur die Variable dict1. Die Dokumentation, die ich erhielt, hat ein verwirrendes Beispiel. Also für jeden anderen einfach entfernen + ", \ n" + json2 aus der Ausgabe-String und es sollte für Sie arbeiten, denke ich. Die Zeile sieht folgendermaßen aus: Update = json1; – mholmes3038