调用REST方法的CURL示例

t2a7ltrp  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(159)

我正在尝试将curl命令转换为powershell调用-RestMethod
来自MobileIron的命令(以防有人搜索该主题)

curl --user <username>:<password> --header 'Content-Type: application/json' --request PUT 'https://
<mobileiron_core>/api/v2/devices/wakeup?adminDeviceSpaceId=1' --data '{"deviceUuids": ["af0cea8bf56c-
49f5-b615-76cc34936b2f"], "note": "something"}'

好的,我的代码(基于https://gist.github.com/rayterrill/e83a1bd877547eccfd59b656e7f91b48#file-mobileiron-addremovelabels-ps1)

$url = $mi_server + "/api/v2/devices/wakeup?adminDeviceSpaceId=1"
$contentType = "application/json"      

$headers = @{
    Authorization=("Basic {0}" -f $regase64AuthInfo)
}

$data = @{        
    note = "test";
    deviceUuids = $guid
};

$json = $data | ConvertTo-Json;
Invoke-RestMethod -Method PUT -Uri $url -ContentType $contentType -Headers $headers -Body $data;

但是我得到了400个错误-所以,据我所知-数据有问题,但是什么?

8ulbf1ek

8ulbf1ek1#

MobileIron 400是一个一般性的错误:400错误请求,意味着请求无效。
随附的错误消息(跟在错误代码后面)说明了原因。
您可以张贴错误消息的其余部分吗?
不能将--data-BodyPUT请求一起使用。
必须为数据生成查询字符串。
查询字符串必须为url编码。
因为是HTTPS传输,所以可能需要-k(--unsecure)
PUT请求可以工作,我相信MobileIron更喜欢GET,两者之间没有真实的的区别。我测试了两者。
我尝试过(我用PHP进行了测试)
PUT请求
请求标头

Content-Type: application/json
 Accept: application/json

POST DATA与查询字符串相同
我检查了有无POST数据,没有变化。
我还发送了没有查询字符串的POST数据,如果没有发送数据,它就是。
URL和查询

$query = urlencode('{"deviceUuids": ["af0cea8bf56c-49f5-b615-76cc34936b2f"], "note": "something"}');
 $url =  https://<domain>/api/v2/devices/wakeup? . $query

URL被更改为我的服务器到一个应用程序,返回请求头,和参数。
它在服务器上返回以下内容:
请求标头:

Content-Type: application/json
Accept: application/json
Accept-Encoding: deflate, gzip, br
Expect: 100-continue
Host: mydomain.com
Transfer-Encoding: chunked

服务器GET和服务器REQUEST值

$_GET
array (
  '{"deviceUuids":_' => 
  array (
    '"af0cea8bf56c-49f5-b615-76cc34936b2f"' => '',
  ),
)
$_REQUEST
array (
  '{"deviceUuids":_' => 
  array (
    '"af0cea8bf56c-49f5-b615-76cc34936b2f"' => '',
  ),
)

请求查询

$_SERVER['QUERY_STRING'])  (url decoded)
{"deviceUuids": ["af0cea8bf56c-49f5-b615-76cc34936b2f"], "note": "something"}

注意上面的JSON查询字符串被截断了。
但在争论中

argv array (url decoded)    
0 = {"deviceUuids":
1 = ["af0cea8bf56c-49f5-b615-76cc34936b2f"],
2 = "note":
3 = "something"}

我删除了内容类型:application/json,并且没有任何更改。
我将PUT更改为GET,没有更改
当我开始发送Content=Type: application/json
对于POST请求,没有查询字符串,POS数据仅在请求的正文中。
下面是一些MobileIron文档中的请求示例:
第一个请求是默认的GET,而不是PUT。

curl -u admin_username:admin_password -kv "https://URL_to_your_mobileiron_cloud_environment/api/v1/account?emailAddress=johnnydoe@acme.com&uid=johnnydoe@acme.com&accountSource=Local" -d ''

curl GET -kv -u user:password "https://[mobileiron_cloud]/api/v1/device/57d9903c-aadf-4b40-aef3-e1f24302f180/customattributes”

curl -X POST -kv -u user:password -H 'Content-Type: application/json' -d '{ "attrs" : { "tlark" : [ "1" ] } } ' "https://[mobileiron_cloud]/api/v1/device/22000/customattributes"

curl -X POST -kv -u user:password -H 'Content-Type: application/json' -d '{ "attrs" : { "tlark" : [ "1" ] } } ' "https://[mobileiron_cloud]/api/v1/device/8bcc4cee-dca9-476d-8710-9bb1e738ade9/customattributes"
ht4b089n

ht4b089n2#

$param_pam_pam = @{
        Method      = 'PUT'
        Uri         = "$url"
        ContentType = "application/json"
        Headers     = @{authorization = ("Basic {0}" -f $regase64AuthInfo) }
        Body        = @{
                        deviceUuids = @($guid)
                        note = "force check-in from $ma"
                        } | ConvertTo-Json
    }

    $reg = Invoke-RestMethod @param_pam_pam

相关问题