Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

HttpLibrary.HTTP ошибка 404 при отправке PATCH запроса через "Http Request"


(Виктор) #1

Добрый день.
Мне нужно отправить “PATCH” web запрос, пишу на Robot Framework с использованием библиотеки HttpLibrary.HTTP. В ответ получаю 404 ошибку, хотя данные вроде правильные.

В документации написано использовать кейворд Http Request (verb, url)
При уже созданном HTTP Context-е задаю нужный мне для авторизации header (Set Request Header), задаю тело запроса (Set Request Body), затем отправляю сам запрос:
Http Request | PATCH | ${myURL}
Получаю в ответ ошибку 404.

Когда создаю такой же запрос в Fiddler (те же Header, body и URL) и отправляю, то всё срабатывает без ошибок.
Другие аналогичные запросы, которые я отправляю к другим функциям своего REST Web-сервиса кейвордами POST и DELETE срабатывают без ошибок.
Пробовал также брать PATCH в кавычки при вызове,
Http Request | “PATCH” | ${myURL}
тогда получаю error 400 bad request
(сейчас ещё подумалось, надо будет посмотреть что возвращается в теле и в заголовках при 404 ошибке)

Если у кого-то есть советы как с этим бороться, рад буду выслушать.


(Dmitriy Zverev) #2

Покажите, пожалуйста:

  1. Литстинг кода на “роботе”
  2. Лог patch-запроса в формате debug
  3. Лог patch-запроса от fiddler
    А пока гадаю на кофейной гуще: 404 - not found, сервер что-то не нашёл, в каком параметре вы можете что-либо искать, вероятнее всего неверное uri.

(Виктор) #3

Я ещё на всякий случай попрбовал задавать PATCH и url в не-юникод формате, не сработало. Изначально было в юникод, и тоже не работало, с тем же результатом.

  1. Код выглядит примерно так:

    |Create HTTP Context |henley-current-rest.qa.enviance.kiev.ua |https |

    |${patchNonUnicode}=|Evaluate|u’PATCH’.encode(‘UTF-8’)|sys|
    |Set Request Header |Authorization |${authHeader} |
    |Set Request Body |${reqN6} |
    |${urlNonUnicode}=|Evaluate|u’/ver2/WorkflowService.svc/workflows/${reqN4id}’.encode(‘UTF-8’)|
    |Http Request|${patchNonUnicode}|${urlNonUnicode}|

  2. кусок Лога patch-запроса в формате trace:

    KEYWORD: HttpLibrary.HTTP.Http Request ${patchNonUnicode}, ${urlNonUnicode} Expand All
    Documentation:
    Issues a HTTP request with an uncommon HTTP Verb.
    Start / End / Elapsed: 20140425 14:36:08.132 / 20140425 14:36:08.145 / 00:00:00.013
    14:36:08.133 TRACE Arguments: [ ‘PATCH’ | ‘/ver2/WorkflowService.svc/workflows/2e596219-7ce5-4b1f-b524-a86b7dde0508’ ]
    14:36:08.133 DEBUG Request headers:
    14:36:08.133 DEBUG Host: henley-current-rest.qa.enviance.kiev.ua
    14:36:08.133 DEBUG Authorization: Enviance 17058a83-8822-4eb4-af3d-295f03bed09e
    14:36:08.133 DEBUG Request body:
    14:36:08.133 DEBUG { “workflowInfo”:{ “workflowTypeName”:“EAA-CorrectiveAction”, “assignedTo”:[ {“userIdOrName”:“AuditAppAutomation”} ] } }
    14:36:08.133 DEBUG Performing PATCH request on https://henley-current-rest.qa.enviance.kiev.ua/ver2/WorkflowService.svc/workflows/2e596219-7ce5-4b1f-b524-a86b7dde0508
    14:36:08.143 DEBUG Response status line: 404 Not Found
    14:36:08.143 DEBUG Response headers:
    14:36:08.143 DEBUG date: Fri, 25 Apr 2014 11:36:08 GMT
    14:36:08.143 DEBUG content-length: 0
    14:36:08.143 DEBUG server: Microsoft-IIS/8.0
    14:36:08.143 DEBUG content-type: text/plain
    14:36:08.143 DEBUG x-powered-by: ASP.NET
    14:36:08.144 DEBUG No response body received
    14:36:08.145 FAIL Request should have succeeded, but was “404 Not Found”.
    14:36:08.145 DEBUG Traceback (most recent call last):
    File “C:\Python27\lib\site-packages\HttpLibrary_init_.py”, line 201, in http_request
    method=verb.upper(),)
    File “C:\Python27\lib\site-packages\HttpLibrary_init_.py”, line 102, in post_process_request
    self.response.status

  3. Лог patch-запроса от fiddler

    PATCH https://henley-current-rest.qa.enviance.kiev.ua/ver2/WorkflowService.svc/workflows/2e596219-7ce5-4b1f-b524-a86b7dde0508 HTTP/1.1
    User-Agent: Fiddler
    Host: henley-current-rest.qa.enviance.kiev.ua
    Authorization: Enviance 17058a83-8822-4eb4-af3d-295f03bed09e
    Content-Length: 115

    { “workflowInfo”:{ “workflowTypeName”:“EAA-CorrectiveAction”, “assignedTo”:[ {“userIdOrName”:“utechenko_eaa”} ] } }

fiddler-запрос при этом срабатывает, возвращает код 204 и выполняет нужные действия.

Пробовал отсылать просто PATCH запрос с неправильным адресом на левый web-сервер, в логах того сервера (для ошибочных запросов) видно что PATCH запрос приходит, и url совпадает с тем, что я задавал.

Я пытался fiddler-ом перехватить что отправляется из robot-а, но у меня не получилось. Если кто знает как это делать - подскажите пожалуйста, а то я в поисковике что-то сразу такое не нашёл (пробовал ставить http_proxy Environment Variable чтобы она направляла в fiddler, но безрезультатно)

Есть конечно вариант написать какой-нибудь exe-шник, который бы отправлял нужный запрос, и вызывать его через библиокеку OperatingSystem, но это как-то неспортивно совсем. Все остальные запросы в HttpLibrary работают, а этот - нет


(Dmitriy Zverev) #4

Кроме лишней перекодировки не вижу ничего странного.
При этом вот этот код работает

*** Test Cases ***    
test
        HttpLibrary.HTTP.Create Http Context    host=echo.200please.com    scheme=http
        HttpLibrary.HTTP.Set Request Body    { "workflowInfo":{ "workflowTypeName":"EAA-CorrectiveAction", "assignedTo":[ {"userIdOrName":"AuditAppAutomation"} ] } }
        HttpLibrary.HTTP.Http Request    PATCH    /ver2/WorkflowService.svc/workflows/2e596219-7ce5-4b1f-b524-a86b7dde0508

В крайнем случае Вы можете написать однострочник для отправки запроса при помощи requests.
${r}= Evaluate requests.patch(url, data=None, **kwargs) requests