mac - 如何使用Curl從終端/命令行發布JSON數據到測試Spring REST?




post json file curl (12)

HTTPiecurl的推薦替代品,因為你可以做到

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

默認情況下它會說JSON,並且會處理為您設置必要的標頭以及將數據編碼為有效的JSON。 還有:

Some-Header:value

對於標題,和

name==value

用於查詢字符串參數。 如果您有大量數據,您也可以從文件中讀取它,如果它是JSON編碼的:

 [email protected]

我使用Ubuntu並在其上安裝了Curl。 我想用Curl測試我的Spring REST應用程序。 我在Java端編寫了我的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命令的正確格式的任何想法?

編輯:

這是我的Java端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;
} 

你可能會發現有用的東西: https://github.com/micha/restyhttps://github.com/micha/resty

它是CURL的包裝器,簡化了命令行REST請求。 您將其指向您的API端點,它為您提供PUT和POST命令。 (從主頁改編的例子)

$ resty http://127.0.0.1:8080/data #Sets up resty to point at your endpoing
$ GET /blogs.json                  #Gets http://127.0.0.1:8080/data/blogs.json
                                   #Put JSON
$ PUT /blogs/2.json '{"id" : 2, "title" : "updated post", "body" : "This is the new."}'
                                   # POST JSON from a file
$ POST /blogs/5.json < /tmp/blog.json

此外,通常仍需要添加內容類型標頭。 但是,您可以執行一次設置默認的每站點每個方法添加配置文件: 設置默認RESTY選項


例如,創建一個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

嘗試將您的數據放在一個文件中,比如body.json ,然後使用

curl -H "Content-Type: application/json" --data @body.json http://localhost:8080/ui/webapp/conf

它對我有用:

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

很高興映射到Spring控制器:

@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是一個帶有id屬性的簡單POJO


對於Windows,使用-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


您需要將content-type設置為application / json。 但-d發送Content-Type application/x-www-form-urlencoded ,這在Spring方面是不被接受的。

看一下curl手冊頁 ,我想你可以使用-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--data

請注意,如果使用-d ,則-request POST可選的 ,因為-d標誌表示POST請求。

在Windows上,情況略有不同。 查看評論主題。


我遇到了同樣的問題。 我可以通過指定來解決它

-H "Content-Type: application/json; charset=UTF-8"

派對有點晚了,但是我沒有看到這個,所以在這裡,你也可以將你的json放在一個文件中並通過標準輸入使用--file-upload選項將其傳遞給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要發送的數據。


這對我有用:

curl -H "Content-Type: application/json" -X POST -d @./my_json_body.txt http://192.168.1.1/json




curl