كيفية نشر بيانات JSON مع Curl من Terminal/Commandline إلى اختبار Spring REST؟




spring-mvc (13)

أستخدم JSON في طلبي وبسيطة مثل:

curl -X POST -H "Content-Type:application/json" -d '{"params1":"value1","params2":"value2"} hostname:port/api

ولكن إذا كان لديك عدد كبير من المعلمات تفضل دائمًا استخدام ملف لهيئة طلب JSON على النحو التالي:

curl -X POST -H "Content-Type:application/json" -F "[email protected]/users/suchi/dekstop/JSON_request.txt" hostname:port/api

أستخدم أوبونتو وتركيبة اللف على ذلك. أريد اختبار تطبيق Spring REST مع Curl. كتبت رمز POST الخاص بي في جانب جافا. ومع ذلك ، أريد اختباره مع Curl. أحاول نشر بيانات JSON. مثال بيانات مثل هذا:

{"value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true}

أنا استخدم هذا الأمر:

curl -i \
    -H "Accept: application/json" \
    -H "X-HTTP-Method-Override: PUT" \
    -X POST -d "value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true \
    http://localhost:8080/xx/xxx/xxxx

تقوم بإرجاع هذا الخطأ:

HTTP/1.1 415 Unsupported Media Type
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 1051
Date: Wed, 24 Aug 2011 08:50:17 GMT

وصف الخطأ هو:

رفض الخادم هذا الطلب لأن كيان الطلب في شكل غير مدعوم من المورد المطلوب للأسلوب المطلوب ().

سجل Tomcat: "POST / ui / webapp / conf / clear HTTP / 1.1" 415 1051

أي أفكار حول التنسيق الصحيح لأمر Curl؟

تصحيح:

هذا هو رمز PUT جانبي جافا (لقد اختبرت GET و DELETE وأنها تعمل)

@RequestMapping(method = RequestMethod.PUT)
public Configuration updateConfiguration(HttpServletResponse response, @RequestBody Configuration configuration) { //consider @Valid tag
    configuration.setName("PUT worked");
    //todo If error occurs response.sendError(HttpServletResponse.SC_NOT_FOUND);
    return configuration;
} 

أستخدم التنسيق أدناه للاختبار باستخدام خادم الويب.

use -F 'json data'

لنفترض تنسيق تنسيق JSON هذا:

{
    'comment': {
        'who':'some_one',
        'desc' : 'get it'
    }
}

مثال كامل

curl -XPOST your_address/api -F comment='{"who":"some_one", "desc":"get it"}'

أنشئ ملف JSON "MyData.json" وأضف محتوى:

[
    {
        "Key_one": "Value_one",
        "Key_two": "Value_two",
        "Key_three": "Value_three"
    }
]

بعد ذلك ، تحتاج إلى تشغيل الأمر التالي:

curl -v -H "Content-Type: application/json" -X POST --data @MyData.json -u USERNAME:PASSWORD http://localhost:8000/env/add_server

إذا كنت تختبر الكثير من عمليات الإرسال / الاستجابات من JSON مقابل واجهة RESTful ، فقد تحتاج إلى التحقق من المكون الإضافي Postman لـ Chrome (الذي يسمح لك بتعريف اختبارات خدمة الويب يدويًا) وأمر Newman المستند إلى Node.js رفيق خط (الذي يسمح لك لأتمتة الاختبارات ضد "مجموعات" من اختبارات بوستمان.) على حد سواء حرة ومفتوحة!


بالنسبة لنظام التشغيل Windows ، فإن عرض سعر واحد للقيمة -d لم يكن -d لي ، ولكنه نجح بعد تغييره إلى علامة اقتباس مزدوجة. أيضا أنا بحاجة إلى الهروب من علامات الاقتباس المزدوجة داخل أقواس معقوفة.

هذا هو ، ما يلي لم تنجح:

curl -i -X POST -H "Content-Type: application/json" -d '{"key":"val"}' http://localhost:8080/appname/path

لكن ما يلي:

curl -i -X POST -H "Content-Type: application/json" -d "{\"key\":\"val\"}" http://localhost:8080/appname/path

تحتاج إلى تعيين نوع المحتوى الخاص بك إلى تطبيق / json. ولكن -d يرسل application/x-www-form-urlencoded نوع المحتوى application/x-www-form-urlencoded ، والذي لا يتم قبوله من جانب Spring.

بالنظر إلى صفحة "curl man" ، أعتقد أنه يمكنك استخدام -H :

-H "Content-Type: application/json"

مثال كامل:

curl --header "Content-Type: application/json" \
  --request POST \
  --data '{"username":"xyz","password":"xyz"}' \
  http://localhost:3000/api/login

( -H اختصار لـ - --header ، -d for --data )

لاحظ أن -request POST اختياري إذا كنت تستخدم -d ، حيث إن علامة -d تعني طلب POST.

في Windows ، تختلف الأمور قليلاً. انظر موضوع التعليق.


على سبيل المثال ، أنشئ ملف JSON ، params.json ، وأضف هذا المحتوى إليه:

[
    {
        "environment": "Devel",
        "description": "Machine for test, please do not delete!"
    }
]

ثم قمت بتشغيل هذا الأمر:

curl -v -H "Content-Type: application/json" -X POST --data @params.json -u your_username:your_password http://localhost:8000/env/add_server

عملت لي باستخدام:

curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"id":100}' http://localhost/api/postJsonReader.do

تم تعيينها بسعادة إلى وحدة التحكم في الربيع:

@RequestMapping(value = "/postJsonReader", method = RequestMethod.POST)
public @ResponseBody String processPostJsonData(@RequestBody IdOnly idOnly) throws Exception {
        logger.debug("JsonReaderController hit! Reading JSON data!"+idOnly.getId());
        return "JSON Received";
}

IdOnly هو POJO بسيط مع خاصية معرف.


لقد عمل ذلك جيدًا بالنسبة لي ، بالإضافة إلى استخدام مصادقة BASIC:

curl -v --proxy '' --basic -u Administrator:password -X POST -H "Content-Type: application/json"
        --data-binary '{"value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true}'
        http://httpbin.org/post

بالطبع ، يجب ألا تستخدم مصادقة BASIC مطلقًا بدون SSL وشهادة محددة.

لقد واجهت هذا مرة أخرى اليوم ، باستخدام cegl's cull 7.49.1 لنظام التشغيل Windows ... وعند استخدام --data أو --data-binary مع وسيطة JSON ، تم تشويش cURL وسيؤدي إلى تفسير {} في JSON كعنوان URL قالب. إضافة وسيطة -g لإيقاف تشغيل cURL globbing ذلك.

راجع أيضًا تمرير عنوان URL مع قوسين للتجويف .


متأخر قليلا للحزب ، لكنني لا أرى هذا المنشور ، حتى هنا ، يمكنك أيضا وضع json في ملف وتمريره إلى curl باستخدام - خيار تحميل الملفات عبر الإدخال القياسي ، مثل هذا:

 echo 'my.awesome.json.function({"do" : "whatever"})' | curl -X POST "http://url" -T -

هذا عمل جيد بالنسبة لي.

curl -X POST --data @json_out.txt http://localhost:8080/

أين،

-X تعني فعل http.

--data تعني البيانات التي تريد إرسالها.


يمكنك استخدام Postman مع واجهة المستخدم الرسومية بديهية لتجميع الأمر cURL الخاص بك.

  1. تثبيت وبدء ساعي البريد
  2. اكتب عنوان URL الخاص بك ، Post Body ، Request Headers إلخ.
  3. انقر على Code
  4. حدد cURL من القائمة المنسدلة
  5. انسخ أمر cURL والصقه

ملاحظة: هناك العديد من الخيارات لإنشاء طلب تلقائي في القائمة المنسدلة ، ولهذا السبب اعتقدت أن منصبي كان ضروريًا في المقام الأول.


HTTPie هو بديل موصى به curl لأنه يمكنك القيام به فقط

$ http POST http://example.com/some/endpoint name=value name1=value1

فهي تتحدث JSON افتراضيًا وستتعامل مع كل من إعداد الرأس الضروري لك وكذلك تشفير البيانات باعتبارها JSON صالحة. يوجد ايضا:

Some-Header:value

للرؤوس و

name==value

لمعلمات سلسلة الاستعلام. إذا كان لديك مجموعة كبيرة من البيانات ، فيمكنك أيضًا قراءتها من ملف يكون JSON مشفرًا:

 [email protected]




curl