2017-08-29 483 views
2

我必须在我的应用程序中插入许多数据,并且通过图形界面需要很多时间。出于这个原因,我想创建一个bash脚本并通过使用REST API进行curl请求(我必须手动指定id)。通过bash脚本执行curl请求

问题是我得到错误:服务器拒绝了这个请求,因为请求实体的格式不是所请求方法的请求资源所支持的格式。

下面是代码

#!/bin/bash 

for i in {1..1} 
do                                             
CURL='/usr/bin/curl -X POST' 
RVMHTTP="http://192.168.1.101:8080/sitewhere/api/devices 
    -H 'accept:application/json' 
    -H 'content-type:application/json' 
    -H 'x-sitewhere-tenant:sitewhere1234567890' 
    --user admin:password" 

DATA=" -d '{\"hardwareId":\"$i",\"siteToken\":\"4e6913db-c8d3-4e45-9436-f0a99b502d3c\",\"specificationToken\":\"82043707-9e3d-441f-bdcc-33cf0f4f7260\"}'" 

# or you can redirect it into a file: 
$CURL $RVMHTTP $DATA >> /home/bluedragon/Desktop/tokens 
done 

我的请求的格式必须被JSON

+0

顺便说一句 - http://shellcheck.net/是一个资源,你可能会觉得有用;尝试修复它发现的内容(并且在您不了解建议背后的原因/建议似乎使事情变得更糟时,阅读与每个错误链接的维基页面),然后再提问。 –

回答

3
#!/usr/bin/env bash 

rvmcurl() { 
    local url 
    url="http://192.168.1.101:8080/sitewhere/${1#/}" 
    shift || return # function should fail if we weren't passed at least one argument 
    curl -XPOST "${rvm_curl_args[@]}" "$url" "[email protected]" 
} 

i=1 # for testing purposes 

rvm_curl_args=(
    -H 'accept:application/json' 
    -H 'content-type:application/json' 
    -H 'x-sitewhere-tenant:sitewhere1234567890' 
    --user admin:password 
) 

data=$(jq -n --arg hardwareId "$i" ' 
{ 
     "hardwareId": $hardwareId, 
     "siteToken": "4e6913db-c8d3-4e45-9436-f0a99b502d3c", 
     "specializationToken": "82043707-9e3d-441f-bdcc-33cf0f4f7260" 
}') 

rvmcurl /api/devices -d "$data" 

注:旨在被解析

  • 命令,或命令片段成多个词,应该从不 b e存储在字符串中。改为使用数组或函数。这样的字符串内部的引号不会被解析为语法,而是(在没有eval的情况下进行解析时,它携带它自己的serious risks and caveats)变成字面值。有关完整说明,请参阅BashFAQ #50
  • 使用支持JSON的工具(如jq)确保生成的数据是合法的JSON。
  • 二进制文件的完全限定路径通常是反模式。它不会导致显着的性能提升(shell缓存PATH查找),但它会减少脚本的可移植性和灵活性(阻止您在PATH中,在导出的shell函数中安装curl的包装器,或者除此以外)。
  • 全大写变量名称位于命名空间used for variables with meaning to the shell and operating system中。使用至少包含一个小写字母的名称作为自己的变量,以防止发生冲突。
+0

很漂亮 –

+0

现在问题是http状态400 - incompleteData:并非提供了所有必需的数据。 这里是我想请求(从邮递员两者),它适用于邮差,如果在庆典 卷曲-X POST http://192.168.1.101:8080/sitewhere/api/devices 直接插入-H'accept:application/json' -H'content-type:application/json' -H'x-sitewhere-tenant:sitewhere1234567890' --user admin:password -d'{ “hardwareId”: “XXX”, “siteToken”: “4e6913db-c8d3-4e45-9436-f0a99b502d3c”, “specificationToken”: “82043707-9e3d-441f-bdcc-33cf0f4f7260” }” –

+0

运行'的bash -x yourscript',和比较它在lo中发出的命令克到你想要的。 –