Χρησιμοποιώ Ubuntu και εγκατέστησα το cURL σε αυτό. Θέλω να δοκιμάσω την εφαρμογή Spring REST με το cURL. Έγραψα τον κώδικα POST μου στην πλευρά της Java. Ωστόσο, θέλω να τον δοκιμάσω με την 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 log: "POST /ui/webapp/conf/clear HTTP/1.1" 415 1051
Ποια είναι η σωστή μορφή της εντολής cURL;
Αυτός είναι ο κώδικας PUT
από την πλευρά της Java (έχω δοκιμάσει τα 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;
}
Πρέπει να ορίσετε τον τύπο περιεχομένου σε application/json. Αλλά το -d
στέλνει το Content-Type application/x-www-form-urlencoded
, το οποίο δεν γίνεται αποδεκτό από την πλευρά της Spring.
Κοιτάζοντας τη curl man page, νομίζω ότι μπορείτε να χρησιμοποιήσετε το -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
είναι η συντομογραφία για --επικεφαλίδα
, -d
για --δεδομένα
)
Σημειώστε ότι το -request POST
είναι προαιρετικό αν χρησιμοποιείτε το -d
, καθώς η σημαία -d
υπονοεί ένα αίτημα POST.
Στα Windows, τα πράγματα είναι ελαφρώς διαφορετικά. Δείτε το νήμα σχολίων.
Μόλις αντιμετώπισα το ίδιο πρόβλημα. Θα μπορούσα να το λύσω καθορίζοντας
-H "Content-Type: application/json; charset=UTF-8"