2017-02-21 37 views
1

Я был брошен в довольно старый проект, выполненный в классическом ASP. Для наших нужд мне нужно сделать простой curl -request, чтобы обновить некоторые данные.PATCH/Post with curl in Classic 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, но поля не обновляются.

Относительно к Убераллу API, они требуют location -объекта, который должен быть в этом, что в настоящее время в моем data -переменных. (Проверено через JSON-валидатор).

Для лучшей читаемости, я предоставить отступом код, а также, возможно, здесь ошибка:

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

Идентификационные являются правильными, я дважды проверил, что уже. Может быть, полезная нагрузка неверна? Что может быть проблемой? Может быть, 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 OK для всего, и в этом случае могут быть пропущены любые ошибки, поэтому при тестировании вы можете просто сделать что-то подобное;

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