إذن، أنا أستخدم واجهة برمجة تطبيقات JSON لإضافة مستخدم إلى مجموعة، وتعمل كما هو متوقع عند استخدامها عبر الطرفية، لكن عندما أستخدم curl من Java، أحصل على {"status":400,"error":"Bad Request"}.
لذلك، تفحصت السجلات ورأيت:
هل يعرف أحد ما الخطأ الذي أرتكبه؟
amotl
(Andreas Motl)
16 يوليو 2021، 10:24م
2
مرحباً،
على الأرجح، لم يتم تمرير المعاملات إلى curl (أفترض أنك تستدعيها من Java) بشكل صحيح. وغالباً ما يرتبط ذلك بوضع علامات اقتباس غير صحيحة.
إذا شاركت كود Java المقابل هنا، فقد يتمكن الآخرون من تخمين ما قد يكون سبباً للمشكلة.
مع أطيب التحيات،
أندرياس.
بالطبع! إليك ما لدي حتى الآن:
command = "curl -X PUT https://discourse.domain.tld/groups/" + roleID + "/members.json \\\n" +
" -d '{\"usernames\" : \"" + user.get("username") + "\"}'\\\n" +
" -H \"Content-Type: application/json\"\n" +
" -H \"Accept: application/json\"\n" +
" -H \"Api-Key: redacted\"\\\n" +
" -H \"Api-Username: Bot\"";
Process nitroProcess = Runtime.getRuntime().exec(command);
String outputString = new BufferedReader(
new InputStreamReader(nitroProcess.getInputStream(), "UTF-8"))
.lines()
.collect(Collectors.joining("\n"));
System.out.println("Output String: " + outputString);
أنا أمرر عددًا صحيحًا لـ roleID، وuser.get("username") هو مجرد نص من طلب JSON.
يمكنني نشر المزيد إذا كان ذلك سيساعد، لكنني أحاول أن أكون حذرًا حتى لا أفضح أي معلومات حساسة.
amotl
(Andreas Motl)
16 يوليو 2021، 10:33م
4
هل يمكنك تنفيذ System.out.println(command) ومشاركة الناتج، مع إخفاء محتوى المتغيرات roleID و user.get("username") إذا كان ذلك مناسبًا؟
مع خالص التحية،
أندرياس.
amotl
(Andreas Motl)
16 يوليو 2021، 10:36م
5
لست متأكدًا مما إذا كان اقتباس \' صحيحًا. ماذا عن هذا؟
-d '{\"usernames\": \"" + user.get("username") + "\"}'\\\n"
إذن، يبدو أن أمر CURL الخاص بي كالتالي:
curl -X PUT https://discourse.domain.tld/groups/50/members.json \
-d '{"usernames" : "Torbjörn"}'\
-H "Content-Type: application/json"
-H "Accept: application/json"
-H "Api-Key: [redacted]"\
-H "Api-Username: Bot"
فيما يتعلق بوضع علامات الاقتباس، كنت أتبع الوثائق هنا .
إذا قمت بلصق هذا الأمر في طرفية WSL الخاصة بي، فسيتم تنفيذه ويعمل كما هو متوقع.
amotl
(Andreas Motl)
16 يوليو 2021، 10:45م
7
شكرًا لك. أود أن أذكر أن بعض الأسطر تنتهي بـ \ وبعضها لا ينتهي. أيضًا، هل من الممكن أن يكون حرف الـ Umlaut هو السبب هنا؟ هل يمكنك أيضًا اختبار ذلك باستخدام اسم مستخدم لا يحتوي على حرف الـ Umlaut؟
لقد قمت بإزالة \ من بعض الأسطر لأنها كانت تسبب خطأ مختلفًا. عندما يكون اسم المستخدم خاليًا من أي أحرف خاصة، تظل المشكلة نفسها.
curl -X PUT https://discourse.domain.tld/groups/50/members.json \
-d '{"usernames" : "Av3r4ge"}'\
-H "Content-Type: application/json"
-H "Accept: application/json"
-H "Api-Key: [redacted]"\
-H "Api-Username: Bot"
مخرجات السلسلة: {"status":400,"error":"Bad Request"}
{"error":"Bad Request","status":400}
amotl
(Andreas Motl)
16 يوليو 2021، 10:52م
9
لقد نفدت من الأفكار هنا.
ربما، بينما لا يزال JSON صالحًا، يمكنك إزالة المسافة بعد المفتاح في حمولة JSON، مثل هذا:
{"usernames":"Av3r4ge"}
نعم، نفس المشكلة - في هذه المرحلة، من المرجح أن أبحث في استخدام مكتبة لتنفيذ الطلب. أنا فقط لا أعرف السبب وراء كل هذه الصعوبة. شكراً لمساعدتك في استكشاف المشكلة وحلها.