如何使用 Excel VBA 获取 curl Api 请求码?

How to get curl Api request code using Excel VBA?

我有一个 API“GET”请求代码,用于从我的 crm 获取会话密钥到 Excel。

我正在尝试重新调整它的用途,以便在“PUT”请求中将信息发送到我的 crm。

我在执行 Open "Put", webServiceURL, False 时收到“错误请求”错误。

我在 .Open "Get", webServiceURL, False 时获得了所有数据(只是没有改变任何东西)。

Sub UpdateEstimate()

    Dim webServiceURL As String
    Dim actionType1 As String
    Dim targetWord1 As String
    Dim actionType2 As String
    Dim targetWord2 As String
    Dim PutEstJson  As String
    Dim APISettings As Worksheet
    Dim res As Variant
    Dim allres As Variant
    Dim Token As String
    Dim scriptControl As Object
    Token = Worksheets("API Settings").Range("e3").Value
    'get token data
    website = "https://cloud.servicebridge.com/api/v1.1/Estimates/25014108?sessionKey="
    webServiceURL = website & Token

    actionType2 = "Accept"
    targetWord2 = "application/json"
    actionType1 = "Content-Type"
    targetWord1 = "application/json"
 
    PutEstJson = Worksheets("API Settings").Range("k7").Value
   
    With CreateObject("WinHttp.WinHttpRequest.5.1")

        .Open "Put", webServiceURL, False
        .setRequestHeader actionType2, targetWord2
        .setRequestHeader actionType1, targetWord1
        
        .Send PutEstJson
         allres = .GetAllResponseHeaders
         res = .responseText
         APIKey = Split(res, "Data")
     
        If .Status = 200 Then
    
            'AVAILABLE INFORMATION
            '_____________________
            ' Debug.Print .Status
            'Debug.Print .responseText
            ' Debug.Print .GetAllResponseHeaders
            'MsgBox .GetAllResponseHeaders
        
            'paste token data
        
            Worksheets("API Settings").Cells(4, 3).Value = Split(res, "data")
            Worksheets("API Settings").Cells(4, 4).Value = allres
        
        Else
            MsgBox .Status & ": " & .StatusText
        End If
   
    End With

End Sub

我作为 PutEstJson 发送的 json 格式数据的副本。

curl -X PUT --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{ 
Location:   {
Id: 0,
Name:   "string"
},  
UpdateLocation: false,
GeoCoordinates: {
Latitude:   0,
Longitude:  0
},  
UpdateGeoCoordinates:   false,
Contact:    {
Id: 0,
Name:   "string"
},  
UpdateContact:  false,
ThirdPartyBillPayer:    {
Id: 0,
Name:   "string"
},  
UpdateThirdPartyBillPayer:  false,
MarketingCampaign:  {
Id: 101002,
Name:   "Yard Sign"
},  
UpdateMarketingCampaign:    false,
JobCategory:    {
Id: 21412,
Name:   "Finished Estimate: Hot Lead"
},  
UpdateJobCategory:  true,
SalesRepresentative:    {
Id: 382891,
Name:   "Marvin Lamar"
},  
UpdateSalesRepresentative:  true,
DefaultEquipment:   {
Id: 0,
Name:   "string"
},  
UpdateDefaultEquipment: false,
Description:    "Gutter/Guard Estimate",
UpdateDescription:  true,
Status: "Assigned",
UpdateStatus:   false,
Branch: {
Id: 0,
Name:   "string"
},  
UpdateBranch:   false,
Team:   {
Id: 188466,
Name:   "Yerry"
},  
UpdateTeam: false,
ConfirmationStatus: "None",
UpdateConfirmationStatus:   false,
EstimateDate:   "2020-04-15T04:46:02.867Z",
UpdateEstimateDate: false,
ScheduledTime:  0,
UpdateScheduledTime:    false,
EstimatedDuration:  0,
UpdateEstimatedDuration:    false,
ArrivalWindow:  0,
UpdateArrivalWindow:    false,
EarliestArrival:    0,
UpdateEarliestArrival:  false,
LatestDeparture:    0,
UpdateLatestDeparture:  false,
Notes:  "string",
UpdateNotes:    false,
PrivateNotes:   "string",
UpdatePrivateNotes: false,
InvoiceNotes:   "string",
UpdateInvoiceNotes: false,
UpdateReminder: false,
ReminderType:   "None",
ReminderValue:  0,
ReminderMessage:    "string",
TaxCalculation: "TaxExcluded",
UpdateTaxCalculation:   false,
CustomFields:   [
{   
Name:   "S Walk Around Done",
Value:  "",
Name:   "S4 Est Rating",
Value:  "",
Name:   "S2 I went for",
Value:  "",
Name:   "S3 I Feel Est. Will Close In",
Value:  "",
Name:   "S7 1st Follow Up Date",
Value:  "",
Name:   "S7 2nd Follow Up Date",
Value:  "",
Name:   "S7 3rd Follow Up Date",
Value:  "",
Name:   "Follow-up Notes",
Value:  "",
}   
],  
UpdateCustomFields: false,
SparseUpdate: "True" ,
Version:    10,
ExternalSystemId:   "string",
UpdateExternalSystemId: false,
}   
' 'https://cloud.servicebridge.com/api/v1.1/Estimates/25014108?sessionKey=6550e422e843f1d94e2e8c441e05d7197f0b871' 

如果不知道您尝试调用的 API 方法的详细信息,恐怕很难帮助解决问题。该错误表明您尝试 post 的 JSON 有问题。一些对我来说很突出的潜在问题是:

  1. 您的 JSON 中似乎缺少一堆 []{} 个字符。该结构格式错误,因此无效 JSON,这肯定会导致您的错误。

  2. 您的 JSON 键可能应该在双引号内构成 有效 JSON。

    `{
       "Id": 0,
       "Name": "string"
    } ...`
    
  3. 我注意到你的 JSON 末尾有一个流氓逗号... 这绝对是无效的 JSON.

我建议将您的 JSON 放在可以格式化 JSON(例如 vscode)的文本编辑器上。这应该可以帮助您更好地了解 JSON 的结构。我不太清楚 JSON 结构应该是什么,所以这是我对它可能是什么样子的最佳猜测。我不得不猜测缺少的 []{} 字符应该在哪里。

{
    "Id": 0,
    "Name": "string",
    "UpdateLocation": false,
    "GeoCoordinates": {
        "Latitude": 0,
        "Longitude": 0
    },
    "UpdateGeoCoordinates": false,
    "Contact": {
        "Id": 0,
        "Name": "string"
    },
    "UpdateContact": false,
    "ThirdPartyBillPayer": {
        "Id": 0,
        "Name": "string"
    },
    "UpdateThirdPartyBillPayer": false,
    "MarketingCampaign": {
        "Id": 101002,
        "Name": "Yard Sign"
    },
    "UpdateMarketingCampaign": false,
    "JobCategory": {
        "Id": 21412,
        "Name": "Finished Estimate: Hot Lead"
    },
    "UpdateJobCategory": true,
    "SalesRepresentative": {
        "Id": 382891,
        "Name": "Marvin Lamar"
    },
    "UpdateSalesRepresentative": true,
    "DefaultEquipment": {
        "Id": 0,
        "Name": "string"
    },
    "UpdateDefaultEquipment": false,
    "Description": "Gutter/Guard Estimate",
    "UpdateDescription": true,
    "Status": "Assigned",
    "UpdateStatus": false,
    "Branch": {
        "Id": 0,
        "Name": "string"
    },
    "UpdateBranch": false,
    "Team": {
        "Id": 188466,
        "Name": "Yerry"
    },
    "UpdateTeam": false,
    "ConfirmationStatus": "None",
    "UpdateConfirmationStatus": false,
    "EstimateDate": "2020-04-15T04:46:02.867Z",
    "UpdateEstimateDate": false,
    "ScheduledTime": 0,
    "UpdateScheduledTime": false,
    "EstimatedDuration": 0,
    "UpdateEstimatedDuration": false,
    "ArrivalWindow": 0,
    "UpdateArrivalWindow": false,
    "EarliestArrival": 0,
    "UpdateEarliestArrival": false,
    "LatestDeparture": 0,
    "UpdateLatestDeparture": false,
    "Notes": "string",
    "UpdateNotes": false,
    "PrivateNotes": "string",
    "UpdatePrivateNotes": false,
    "InvoiceNotes": "string",
    "UpdateInvoiceNotes": false,
    "UpdateReminder": false,
    "ReminderType": "None",
    "ReminderValue": 0,
    "ReminderMessage": "string",
    "TaxCalculation": "TaxExcluded",
    "UpdateTaxCalculation": false,
    "CustomFields": [
        {
            "Name": "S Walk Around Done",
            "Value": ""
        },
        {
            "Name": "S4 Est Rating",
            "Value": ""
        },
        {
            "Name": "S2 I went for",
            "Value": ""
        },
        {
            "Name": "S3 I Feel Est. Will Close In",
            "Value": ""
        },
        {
            "Name": "S7 1st Follow Up Date",
            "Value": ""
        },
        {
            "Name": "S7 2nd Follow Up Date",
            "Value": ""
        },
        {
            "Name": "S7 3rd Follow Up Date",
            "Value": ""
        },
        {
            "Name": "Follow-up Notes",
            "Value": "test1"
        }
    ],
    "UpdateCustomFields": true,
    "SparseUpdate": "True",
    "Version": 11,
    "ExternalSystemId": "string",
    "UpdateExternalSystemId": false
}