Restsharp: NullReferenceException pour les paramètres de corps qui n'ont pas de nom

Créé le 5 avr. 2019  ·  20Commentaires  ·  Source: restsharp/RestSharp

Comportement attendu

Je n'aurais pas à ajouter de nom, ou le message d'erreur serait plus clair qu'un nom de paramètre manquait.

Comportement réel

Une NullReferenceException est levée.

Étapes pour reproduire le problème

  1. Ajouter un paramètre de corps de requête sans nom

Cela doit être le problème dans RestClient.ConfigureHttp (en supposant que le nom est là):

var parameterExists =
                    request.Parameters.Any(p =>
                        p.Name.Equals(defaultParameter.Name, StringComparison.InvariantCultureIgnoreCase)
                        && p.Type == defaultParameter.Type);

Caractéristiques

  • Version : 106.6.9.0
  • Plateforme : .NET Framework
  • Sous-système :

Trace de la pile


System.NullReferenceException : référence d'objet non définie sur une instance d'un objet.
à RestSharp.RestClient.<>c__DisplayClass172_0.b__8(Paramètre p)
à System.Linq.Enumerable.Any TSource
à RestSharp.RestClient.ConfigureHttp (demande IRestRequest)
à RestSharp.RestClient.ExecuteAsync (demande IRestRequest, action 2 callback, String httpMethod, Func 4 getWebRequest)
à RestSharp.RestClient.ExecuteAsync (demande IRestRequest, rappel Action`2, méthode httpMethod)

Tous les 20 commentaires

@vbenedichuk une raison pour laquelle vous ne voulez pas soumettre de PR ?

Fermé dans la prochaine version. Changement de rupture !

J'essayais de déboguer/réparer un problème, mais j'ai découvert que votre modification introduisait un bogue. Voir la ligne https://github.com/restsharp/RestSharp/blob/a8a9f3473be30317fc449c1c47e3f3cd74e8bab4/RestSharp/RestRequest.cs#L335

Vous verrez que la ligne met à jour un objet mais ne fournit pas de nom requis par la validation :

https://github.com/restsharp/RestSharp/blob/a8a9f3473be30317fc449c1c47e3f3cd74e8bab4/RestSharp/Parameter.cs#L28 -L35

https://github.com/restsharp/RestSharp/blob/a8a9f3473be30317fc449c1c47e3f3cd74e8bab4/RestSharp/Validation/Ensure.cs#L13 -L17

Demande de tirage soumise :
https://github.com/restsharp/RestSharp/pull/1337

On dirait qu'il nous manque des tests. En effet, les paramètres du corps n'ont pas besoin de nom. Je pense qu'un meilleur correctif ne vérifierait que si le nom n'est pas vide pour les paramètres qui ne sont pas de type body.

J'ai mis à jour la demande de tirage pour refléter votre idée.

J'ai seulement attrapé ce problème parce que j'essayais de mieux comprendre RestSharp. Cela ne semble pas être un problème dans le package nuget pour le moment.

Oui, la nouvelle version n'est pas encore publiée. J'ai apporté quelques modifications supplémentaires en préparation pour passer à une meilleure gestion asynchrone et également pour résoudre certains des problèmes liés à la gestion des exceptions

quand sera-t-il réparé ?

Je peux voir qu'il y a la version 106.7.0 mais mon studio visuel n'affiche que 106.6.10 pourquoi ?

Corrigé en 106,9

Cela reste un problème dans la dernière version Alexey

@ronaldfeb J'ai fusionné le PR qui prétendait résoudre ce problème, pourriez-vous s'il vous plaît publier votre code ?

@alexeyzimarev j'ai juste une fonction post simple qui prend un objet JSON comme corps. Le paramètre de nom pour le corps est null.

        public async Task<Result> postAsync(object objectToUpdate, string apiEndPoint)
        {
            Result result = new Result();

            try
            {
                var client = new RestClient(apiEndPoint);

                var request = new RestRequest(apiEndPoint, Method.POST);
                request.OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; };
                request.RequestFormat = DataFormat.Json;
                request.AddJsonBody(objectToUpdate);
                var response = await client.ExecuteTaskAsync(request);
                //var response = client.ExecuteDynamic(request);


                if (response.StatusCode != HttpStatusCode.Created)
                {

                    Console.WriteLine("Access Token cannot obtain, process terminate");
                    result.Success = false;
                    result.Message = response.ErrorMessage;
                    return result;

                }

                result.Success = true;
                result.Message = "OK";
                return result;

            }
            catch
            {
                throw;
            }

            // await Audit(_settings, new AuditEntry() { Action = EnumTypes.Actions.Add.ToString(), Area = "Testcase", AuditId = obj.key, DatetimeStamp = DateTime.Now, ClientId = userId, NewValue = obj, OldValue = null });
        }

Le corps du json :

{
  "smartloadId": "string",
  "clientReference": "string",
  "smsRecipientMsisdn": "string",
  "deviceId": "string",
  "productId": 0,
  "amount": 0,
  "pinless": true,
  "sendSms": true,
  "orderRefID": 0
}

Pourriez-vous coller les détails de l'exception, y compris la trace de la pile ?

@alexeyzimarev (Corrigé en 106.9)
Ma version RestSharp (106.10.1)

Inscription MemberSignUp = nouveau MemberSignUp()
{
E-mail = "TEST",
Pseudo = "TEST",
} ;
RestRequest req = new RestRequest("/my/resource", Method.POST);

        req.AlwaysMultipartFormData = true;
        req.AddHeader("content-Type", "multipart/form-data");
        req.AddJsonBody(signup);

mais -> req.Parameters[1].Name = est vide.

comment définir le nom du paramètre lorsque je req.AddJsonBody()

image

j'ai une erreur similaire
Code

string url = "http://????????????????????????????/reports/new/Report2_11_1?page=reports/new/Report2_11_1&rep_nd=04.03.2020&rep_nd_h=18&rep_nd_min=00&rep_kd=05.03.2020&rep_kd_h=18&rep_kd_min=00&&rep_nd_fact_time=&rep_nd_h_fact_time=00&rep_nd_min_fact_time=00&rep_kd_fact_time=&rep_kd_h_fact_time=00&rep_kd_min_fact_time=00&train_registration=1&kind_rep_type=1,2&four_report_save=4,5&usw=1007&ush=1108";
CookieContainer container = new CookieContainer();
RestClient client = new RestClient();
client.CookieContainer = container;

RestRequest request = new RestRequest(url, Method.GET);

Erreur

Unhandled exception. System.ArgumentNullException: Value cannot be null. (Parameter 'name')
   at RestSharp.RestRequest..ctor(String resource, Method method, DataFormat dataFormat)
   at RestSharp.RestRequest..ctor(String resource, Method method)

J'ai essayé sur différentes versions : 106.10.1, 106.10.0б, 106.9.0
Avec une apparence d'url fonctionne bien

"http://????????????????????????????/reports/new/Report2_1_1?page=reports/new/Report2_1_1&rep_nd=01.01.2019&rep_nd_h=0
0&rep_nd_min=00&rep_kd=05.03.2019&rep_kd_h=23&rep_kd_min=59&rep_status=0,1,2,4,5,6,7,10&state_among_road=close&rep_stat
us_among_road=0,1,2,4,6,7,10&rep_flg_add_inv=0&rep_flg_add_inv_among=0&rep_conseq=null&rep_character=null&kind_rep_type
=3&rep_service=null&rep_subdivision=null&rep_nod0=null&rep_place0=null&rep_place0_id=null&rep_stan0_1_id=null&rep_stan0
_2_id=null&rep_place0_value=null&rep_object=null&nod_place=null&rep_asu=0,1,2,5,7,11,12,14,15,20,21&rep_asu_dop=1:1&flg
_alien_service=2&usw=1578&ush=705"

@veliev c'est un problème différent, veuillez en ouvrir un séparé

Ok, le problème du paramètre du corps de la requête nécessitant d'avoir un nom est _fixe_. S'il y a d'autres problèmes avec le nom du paramètre étant nul, veuillez ouvrir un problème séparé.

Comment avez-vous ajouté une modification avec rupture (supprimer le constructeur sans paramètre de la classe Parameter) sans changer la version majeure ?
J'ai essayé de mettre à jour de 106.2.1 vers la dernière version, en supposant que s'il a le même majeur (106) sans casser les changements mais PAS !

@bsalmeida comme ça. Idéalement, la classe de paramètres doit être interne. Nous ne pouvons pas accepter les paramètres qui ne sont pas configurés correctement car cela crée plus de problèmes que les gens publient ici.

Cette page vous a été utile?
0 / 5 - 0 notes