2017-02-21 44 views
1

我被扔進了一個非常古老的項目,這是用傳統的ASP製作的。爲了我們的需要,我需要做一個簡單的curl-請求,來更新一些數據。修補程序/貼在經典ASP中的捲曲

我很新的ASP,所以我尋找類似的問題。我偶然發現了這個問題 這裏:

How can I post data using cURL in asp classic?

我試圖儘可能地去適應,但似乎我缺少一個重要的事情,在這裏我需要你的幫助:

功能.ASP

public function makeCurlRequest(strMethod) 

    Dim http: Set http = Server.CreateObject("WinHttp.WinHttpRequest.5.1") 
    Dim privateKey 
    privateKey = "abc def" 
    Dim url: url = "https://sandbox.uberall.com/api/locations/322427?private_key=" & privateKey 
    Dim data: data = "{""location"":{""openingHours"":[{""dayOfWeek"":1,""from1"":""07:01"",""to1"":""07:02""}]}}" 

    'method needs to be PATCH 
    With http 
     Call .Open(strMethod, url, False) 
     Call .SetRequestHeader("Content-Type", "application/json") 
     Call .Send(data) 
    End With 

    If Left(http.Status, 1) = 2 Then 
     response.write("updated") 
     response.end() 
    Else 
     'Output error 
     Call Response.Write("Server returned: " & http.Status & " " & http.StatusText) 
    End If 

end function 

在我的文件,我只需撥打makeCurlRequest("PATCH")。 現在它確實打印「更新」,所以我想我正在檢索200,但是這些字段沒有更新。

關於到uberall API,他們需要一個location -object,這應該是這個,什麼是目前在我data -variable。 (通過JSON驗證器檢查它)。

爲了更好的可讀性,我將提供縮進代碼爲好,也許這裏是一個錯誤:

{ 
    "location":{ 
     "openingHours":[ 
     { 
      "dayOfWeek":1, 
      "from1":"07:01", 
      "to1":"07:02" 
     } 
     ] 
    } 
} 

的ID是正確的,我反覆檢查了。也許有效載荷是錯誤的?可能是什麼問題?也許需要提供data而不是這種方法?

+1

如果有效負載是錯誤的,我期望在4XX範圍內的狀態響應,如果有效負載錯誤,API應該返回成功。調試API的最佳方式是使用Fiddler來查看正在發送和接收的RAW請求和響應。 – Lankymart

+0

以前的評論應該已經閱讀 - 如果有效載荷錯誤,API **不應該**返回成功。 – Lankymart

回答

1

Uberall Tutorials Page

看起來好像該location對象的封裝沒有必要在實施例來看,代替結構體等

{ 
    "openingHours":[ 
    { 
     "dayOfWeek":1, 
     "from1":"07:01", 
     "to1":"07:02" 
    } 
    ] 
} 

在代碼中,改變data變量是;

Dim data: data = "{""openingHours"":[{""dayOfWeek"":1,""from1"":""07:01"",""to1"":""07:02""}]}" 

必須承認,我不得不周圍挖的文檔中找到一個例子證明了他們是如何預期請求的主體被結構化的,這是不太適合的API。另外如果有效載荷是錯誤的,你應該得到一個錯誤,所以你知道有效載荷存在問題,沿着HTTP 400 Bad Request的行是有道理的。

這也可能是API使用HTTP 200確定一切,在這種情況下可能會錯過任何錯誤,所以在測試時你可以做這樣的事情;

Dim http: Set http = Server.CreateObject("WinHttp.WinHttpRequest.5.1") 
Dim privateKey 
privateKey = "abc def" 
Dim url: url = "https://sandbox.uberall.com/api/locations/322427?private_key=" & privateKey 
'Purposefully passing the wrong structure to see what is returned. 
Dim data: data = "{""location"":{""openingHours"":[{""dayOfWeek"":1,""from1"":""07:01"",""to1"":""07:02""}]}}" 

'method needs to be PATCH 
With http 
    Call .Open(strMethod, url, False) 
    Call .SetRequestHeader("Content-Type", "application/json") 
    Call .Send(data) 
End With 

'Not bothered about the status for now, just give me the response. 
Call Response.Write("Server returned: " & http.Status & " " & http.StatusText) 
Call Response.Write("Body: " & http.ResponseText) 
+1

你完全正確。這是封裝:)謝謝你! – DasSaffe