1. 程式人生 > >curl傳送請求簡單實踐

curl傳送請求簡單實踐

環境

作業系統:win7
伺服器:centos6.5

場景

因為有個指令碼需要模擬瀏覽器傳送api請求,該api是用來初始化資料的。
具體指令碼如下:

appKey="TKtXLPUuGkfaRHA"
appSecret="aArwoGW9dYXBGL79oR8Ns3ZXCkPcGFdb"
suffurl="v1/gghq/launch"
time=`date +%s`
sign=`java -Xbootclasspath/a:/home/webuser/gogoal_platform/ggopenapi/lib/snakeyaml.jar -jar ./ggsign/ggsign.jar  "$appKey"
"$appSecret" "$time" "$suffurl"` #echo "$sign" curl -X POST -d "app_key=TKtXLPUuGkfaRHA&time_stamp=1512612452&sign=U7ETnXEaPUu1jNMq4jKf00fiGSM%3D" http://ggservice.sandbox.gofund.com.cn/v1/gghq/launch

這裡我是使用的是post請求,引數是使用&來進行拼接,這種方式,是可以傳送的,併成功的!

但是我如果改成json的形式來發送時總是會報錯,就是伺服器端接收不到引數:

appKey="TKtXLPUuGkfaRHA"
appSecret="aArwoGW9dYXBGL79oR8Ns3ZXCkPcGFdb" suffurl="v1/gghq/launch" time=`date +%s` sign=`java -Xbootclasspath/a:/home/webuser/gogoal_platform/ggopenapi/lib/snakeyaml.jar -jar ./ggsign/ggsign.jar "$appKey" "$appSecret" "$time" "$suffurl"` echo "$sign" echo $time curl -H "Content-type: application/json" -X POST -d
'{"app_key":"'$appKey'","time_stamp":"'$time'","sign":"'$sign'"}' http://ggservice.sandbox.gofund.com.cn/v1/gghq/launch

查了下官網curl教程:

post

引數:

必須型別引數:

    -X POST
    -X PUT
content type-H "Content-Type: application/x-www-form-urlencoded"

    -H "Content-Type: application/json"

資料引數:
    form urlencoded: -d "param1=value1&param2=value2" or -d @data.txt
    json: -d '{"key1":"value1", "key2":"value2"}' or -d @data.json

官網例子:

POST application/x-www-form-urlencoded

application/x-www-form-urlencoded是預設的:

curl -d "param1=value1&param2=value2" -X POST http://localhost:3000/data

指明:

curl -d "param1=value1&param2=value2" -H "Content-Type: application/x-www-form-urlencoded" -X POST http://localhost:3000/data

使用資料檔案的話:

curl -d "@data.txt" -X POST http://localhost:3000/data

POST application/json

curl -d '{"key1":"value1", "key2":"value2"}' -H "Content-Type: application/json" -X POST http://localhost:3000/data

使用資料檔案的話:

curl -d "@data.json" -X POST http://localhost:3000/data

data.json

{
  "key1":"value1",
  "key2":"value2"
}

data.txt

param1=value1&param2=value2

package.json

{
  "name": "postdemo",
  "version": "1.0.0",
  "scripts": {
    "start": "node server.js"
  },
  "dependencies": {
    "body-parser": "^1.15.0",
    "express": "^4.13.4"
  }
}

server.js

var app = require('express')();
var bodyParser = require('body-parser');

app.use(bodyParser.json()); // for parsing application/json
app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded

app.post('/data', function (req, res) {
  console.log(req.body);
  res.end();
});

app.listen(3000);

對比完後,我覺得我沒有寫錯,但是POSTjson形式就是不行。

唯一的區別就是,引數官網是寫死的,而我使用的是變數。

最後我改成GET請求

#!/bin/bash
set i=0
while true
do
appKey="TKtXLPUuGkfaRHA"
appSecret="aArwoGW9dYXBGL79oR8Ns3ZXCkPcGFdb"
suffurl="v1/gghq/launch"
time=`date +%s`
sign=`java -Xbootclasspath/a:/home/webuser/gogoal_platform/ggopenapi/lib/snakeyaml.jar -jar ./ggsign/ggsign.jar  "$appKey" "$appSecret" "$time" "$suffurl"`
#echo "$sign"
#echo $time
#url="http://ggservice.sandbox.gofund.com.cn/v1/gghq/launch"
url="http://ggservice.sandbox.gofund.com.cn/v1/gghq/launch?app_key=$appKey&time_stamp=$time&sign=$sign"
echo "$url"
#curl -H "Content-type: application/json" -X POST -d '{"app_key":"TKtXLPUuGkfaRHA","time_stamp":"1512612452","sign":"U7ETnXEaPUu1jNMq4jKf00fiGSM%3D"}' http://ggservice.sandbox.gofund.com.cn/v1/gghq/launch
#curl -X POST -d "app_key=TKtXLPUuGkfaRHA&time_stamp=1512612452&sign=U7ETnXEaPUu1jNMq4jKf00fiGSM%3D" http://ggservice.sandbox.gofund.com.cn/v1/gghq/launch
#$echo $url
#curlstr=`curl -i -X GET -H "'Content-type':'application/json'" $url -s`
curlstr=`curl -X GET -H "'Content-type':'application/json'" $url -s`
echo "$curlstr"

if [[ "$curlstr" =~ "成功" || "$curlstr" =~ "success" ]]
then
echo "迴圈次數"$i
break
else
sleep 2s
fi
let "i=i+1"
echo "迴圈次數"$i
done

因為我這個指令碼是在重啟專案後,再執行的,而腳本里又要調介面,所以需要放在迴圈裡,不停的執行,直到成功為止。(因為專案剛啟動時,介面未必能立馬調通)。

引數-s

在執行指令碼時,其會列印一些不想要的東東:

類似如下:

 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2381  100  2381    0     0  25963      0 --:--:-- --:--:-- --:--:-- 25880

可以新增引數-s去掉這些統計資訊。

變數的使用

雖然上面我使用變數沒有成功,但是在stackoverflow,對變數的使用有個說明:

使用'"的組合:

now=$(date +"%m-%d-%Y")
curl -X POST -H "Content-Type: application/json" \
    --data '{ "color":"red", "message":"Build failed '"$now"'", "message_format":"text" }' \
    https://api.hipchat.com/v2/room/<room>/notification?auth_token=<token>

對我的例子就是

appKey="TKtXLPUuGkfaRHA"
appSecret="aArwoGW9dYXBGL79oR8Ns3ZXCkPcGFdb"
suffurl="v1/gghq/launch"
time=`date +%s`
sign=`java -Xbootclasspath/a:/home/webuser/gogoal_platform/ggopenapi/lib/snakeyaml.jar -jar ./ggsign/ggsign.jar  "$appKey" "$appSecret" "$time" "$suffurl"`
echo "$sign"
echo $time
# 注意變數的引號
curl -H "Content-type: application/json" -X POST -d '{"app_key":"'"$appKey"'","time_stamp":"'"$time"'","sign":"'"$sign"'"}' http://ggservice.sandbox.gofund.com.cn/v1/gghq/launch

只使用雙引號:

now=$(date +"%m-%d-%Y")
curl -X POST -H "Content-Type: application/json" \
    --data "{ \"color\":\"red\", \"message\":\"Build failed $now\", \"message_format\":\"text\" }" \
    https://api.hipchat.com/v2/room/<room>/notification?auth_token=<token>

對我的例子就是

# 以上省略。。。
curl -H "Content-type: application/json" -X POST -d "{\"app_key\":\"$appKey\",\"time_stamp\":\"$time\",\"sign\":\"$sign\"}" http://ggservice.sandbox.gofund.com.cn/v1/gghq/launch

說明:

使用'包裹變數,將使bash,從字面值上去看待它們;
然而使用",將會用它們的變數值來進行替換。

參考地址: