Что нового

Как сделать POST запрос с телом?

vovsla

Осваивающий
Сообщения
607
Репутация
36
Сразу говорю, что запрос для внутренней сети и у других он работать не будет.
Необходимо сделать POST запрос с телом. В FAQ почитал тему Как отправить POST-запрос
В результате пытаюсь получить данные таким образом
Код:
$Link='http://wibsmanufacturing.dl:8083/ManufacturingService.svc'
$Body=FileRead('1.txt')


$oRequest = ObjCreate('WinHttp.WinHttpRequest.5.1') ;Создаём COM-объект

If @error Then
    MsgBox(16, 'Ошибка', 'Ошибка при создании объекта "WinHttp.WinHttpRequest.5.1".')
    Exit 1
EndIf

$oErrorHandler = ObjEvent('AutoIt.Error', 'ErrorFunc') ;Создаём обработчик ошибок (COM Error Handling http://www.autoitscript.com/autoit3/docs/intro/ComRef.htm)

Func ErrorFunc()
    MsgBox(16, 'Ошибка', $oErrorHandler.description)
    Exit 2
EndFunc

$oRequest.Open('POST', $Link, 0) ;Создаём соеденение, указываем адрес страницы
$oRequest.SetRequestHeader('User-Agent', 'au3browser') ;Указываем заголовок User-Agent
$oRequest.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded') ;Указываем заголовок Content-Type (необходимо для POST-запроса (Content-Length указывается автоматически))
$oRequest.Send($Body) ;отправляем запрос
$sData = $oRequest.ResponseText

$oErrorHandler = 0 ;выключаем обработчик ошибок

MsgBox(0, 'Data', $sData)


Содержимое 1.txt
Код:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://depo.ru/IManufacturingService/GetProductInfo</Action>
  </s:Header>
  <s:Body>
    <GetProductInfo xmlns="http://depo.ru/">
      <serial_number>382117-001</serial_number>
    </GetProductInfo>
  </s:Body>
</s:Envelope>

В ответ ничего не приходит, msgbox отображается пустой, а должен приходить XML файл.
Что не так в запросе?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
А браузер какие заголовки отсылает?
(Если это конечно можно сделать через него)
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
Небольшое уточнение, это SOAP веб-сервис. Я про него почти ничего не знаю, немного погуглил и пока у меня складывается ощущение, что через браузер запрос сделать не получится


Добавлено:
Сообщение автоматически объединено:

Нашел вот такой пример https://www.autoitscript.com/forum/topic/45904-soap-example/?page=2#comment-1235938_wrap
Сам по себе он работает, но с моими исходными данными я ничего получить не могу...
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
Установил, не помогло


Добавлено:
Сообщение автоматически объединено:

Мне дали еще информацию по нашему сервису

Код:
Test
The test form is only available for requests from the local machine. 
SOAP 1.1
The following is a sample SOAP 1.1 request and response. The placeholders shown need to be replaced with actual values.

POST /TestingComputerAssembling.asmx HTTP/1.1
Host: asm.dp
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://wibswebservice.dl/GetConfigDefinition"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetConfigDefinition xmlns="http://wibswebservice.dl">
      <asm_unit_testing>int</asm_unit_testing>
    </GetConfigDefinition>
  </soap:Body>
</soap:Envelope>
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetConfigDefinitionResponse xmlns="http://wibswebservice.dl">
      <GetConfigDefinitionResult>
        <ConfigDefinition>
          <ItemType>string</ItemType>
          <ItemName>string</ItemName>
          <FoundItem>string</FoundItem>
        </ConfigDefinition>
        <ConfigDefinition>
          <ItemType>string</ItemType>
          <ItemName>string</ItemName>
          <FoundItem>string</FoundItem>
        </ConfigDefinition>
      </GetConfigDefinitionResult>
    </GetConfigDefinitionResponse>
  </soap:Body>
</soap:Envelope>
SOAP 1.2
The following is a sample SOAP 1.2 request and response. The placeholders shown need to be replaced with actual values.

POST /TestingComputerAssembling.asmx HTTP/1.1
Host: asm.dp
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <GetConfigDefinition xmlns="http://wibswebservice.dl">
      <asm_unit_testing>int</asm_unit_testing>
    </GetConfigDefinition>
  </soap12:Body>
</soap12:Envelope>
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <GetConfigDefinitionResponse xmlns="http://wibswebservice.dl">
      <GetConfigDefinitionResult>
        <ConfigDefinition>
          <ItemType>string</ItemType>
          <ItemName>string</ItemName>
          <FoundItem>string</FoundItem>
        </ConfigDefinition>
        <ConfigDefinition>
          <ItemType>string</ItemType>
          <ItemName>string</ItemName>
          <FoundItem>string</FoundItem>
        </ConfigDefinition>
      </GetConfigDefinitionResult>
    </GetConfigDefinitionResponse>
  </soap12:Body>
</soap12:Envelope>


Добавлено:
Сообщение автоматически объединено:

Мене кажется, что не хватает параметра Content-Length.
Его так из задавать? И что в нем указывать?
$oRequest.SetRequestHeader('Content-Type', '?')
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Ага, ну значит устанавливайте заголовки Host, Content-Type и SOAPAction такие как вам дали, Content-Length само посчитается
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
Попробовал 2 варианта, опять получаю пустышки

Код:
;~ $File=FileRead('1.txt')
;~ MsgBox(0, 'Data', $File)
;~ Exit



$Link='http://wibsmanufacturing.dl:8083/ManufacturingService.svc'
;~ $Link='http://wibswebservice.dl/GetConfigDefinition'
$Body=FileRead('1.txt')


$oRequest = ObjCreate('WinHttp.WinHttpRequest.5.1') ;Создаём COM-объект

If @error Then
    MsgBox(16, 'Ошибка', 'Ошибка при создании объекта "WinHttp.WinHttpRequest.5.1".')
    Exit 1
EndIf

$oErrorHandler = ObjEvent('AutoIt.Error', 'ErrorFunc') ;Создаём обработчик ошибок (COM Error Handling http://www.autoitscript.com/autoit3/docs/intro/ComRef.htm)

Func ErrorFunc()
    MsgBox(16, 'Ошибка', $oErrorHandler.description)
    Exit 2
EndFunc

$oRequest.Open('POST', $Link, 0) ;Создаём соеденение, указываем адрес страницы
$oRequest.SetRequestHeader('User-Agent', 'au3browser') ;Указываем заголовок User-Agent
$oRequest.SetRequestHeader('Content-Type', 'text/xml') ;Указываем заголовок Content-Type (необходимо для POST-запроса (Content-Length указывается автоматически))

$oRequest.SetRequestHeader('Host', 'asm.dp')
$oRequest.SetRequestHeader('SOAPAction', 'http://wibswebservice.dl/GetConfigDefinition')


$oRequest.Send($Body) ;отправляем запрос
$sData = $oRequest.ResponseText

$oErrorHandler = 0 ;выключаем обработчик ошибок

MsgBox(0, 'Data', $sData)


Код:
#AutoIt3Wrapper_UseX64=N

local $objHTTP
local $strEnvelope
local $strReturn
local $objReturn
local $strQuery
local $strValue

;~ $strValue = InputBox("Testing", "Enter your new value here.", 60007)

; Initialize COM error handler
$oMyError = ObjEvent("AutoIt.Error","MyErrFunc")

$objHTTP = ObjCreate("Microsoft.XMLHTTP")
$objReturn = ObjCreate("Msxml2.DOMDocument.3.0")

; Create the SOAP Envelope
$strEnvelope = '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">' & _
  '<s:Header>' & _
    '<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://depo.ru/IManufacturingService/GetProductInfo</Action>' & _
  '</s:Header>' & _
  '<s:Body>' & _
    '<GetProductInfo xmlns="http://depo.ru/">' & _
      '<serial_number>382196-001</serial_number>' & _
    '</GetProductInfo>' & _
  '</s:Body>' & _
'</s:Envelope>'

; Set up to post to the server
$objHTTP.open ("post", "http://wibsmanufacturing.dl:8083/ManufacturingService.svc?wsdl", False)

; Set a standard SOAP/ XML header for the content-type
$objHTTP.setRequestHeader ("Content-Type", "text/xml")
$objHTTP.setRequestHeader('Host', 'asm.dp')
$objHTTP.setRequestHeader('SOAPAction', 'http://wibswebservice.dl/GetConfigDefinition')

ConsoleWrite("Content of the Soap envelope : "& @CR & $strEnvelope & @CR & @CR)

; Make the SOAP call
$objHTTP.send ('GetProductInfo')

; Get the return envelope
$strReturn = $objHTTP.responseText

ConsoleWrite("-----------" & @CRLF)
ConsoleWrite ("Debug Response : "& @CR & $strReturn & @CR & @CR)
ConsoleWrite("-----------" & @CRLF)

; Load the return envelope into a DOM
$objReturn.loadXML ($strReturn)

ConsoleWrite("Return of the SOAP Msg : " & @CR & @CR & $objReturn.XML & @CR & @CR)

; Query the return envelope
$strQuery = "SOAP:Envelope/SOAP:Body"

$objReturn.selectSingleNode($strQuery)

$Soap = $objReturn.Text

MsgBox(0,"SOAP Response","The Response is  : " & $Soap)

Func MyErrFunc()
  $HexNumber=hex($oMyError.number,8)
  Msgbox(0,"COM Test","We intercepted a COM Error !"       & @CRLF  & @CRLF & _
"err.description is: "    & @TAB & $oMyError.description    & @CRLF & _
"err.windescription:"     & @TAB & $oMyError.windescription & @CRLF & _
"err.number is: "         & @TAB & $HexNumber              & @CRLF & _
"err.lastdllerror is: "   & @TAB & $oMyError.lastdllerror   & @CRLF & _
"err.scriptline is: "     & @TAB & $oMyError.scriptline     & @CRLF & _
"err.source is: "         & @TAB & $oMyError.source         & @CRLF & _
"err.helpfile is: "       & @TAB & $oMyError.helpfile       & @CRLF & _
"err.helpcontext is: "    & @TAB & $oMyError.helpcontext _
)
  SetError(1)
Endfunc
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
А так? Это запрос на тестовый сервер asm.dp(судя по host)
Код:
;~ SOAP 1.2
;~ The following is a sample SOAP 1.2 request and response. The placeholders shown need to be replaced with actual values.

;~ POST /TestingComputerAssembling.asmx HTTP/1.1
;~ Host: asm.dp
;~ Content-Type: application/soap+xml; charset=utf-8
;~ Content-Length: length

$data = '<?xml version="1.0" encoding="utf-8"?>' & _
'<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'& _
  '<soap:Body>'& _
  '<GetConfigDefinition xmlns="http://wibswebservice.dl">'& _
      '<asm_unit_testing>int</asm_unit_testing>'& _
    '</GetConfigDefinition>'& _
  '</soap:Body>'& _
'</soap:Envelope>'

$Link = 'http://asm.dp/TestingComputerAssembling.asmx'
$oRequest = ObjCreate('WinHttp.WinHttpRequest.5.1')
$oRequest.Open('POST', $Link)

$oRequest.SetRequestHeader('Content-Type', 'application/soap+xml; charset=utf-8')
$oRequest.SetRequestHeader('Accept-Encoding', 'deflate')
$oRequest.SetRequestHeader('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8')
$oRequest.Send($data)
If @error Then
	MsgBox(0, 'Ощибка', '0x' & Hex(@error))
Else
	MsgBox(0, 'ResponseHeaders', $oRequest.GetAllResponseHeaders)
	MsgBox(0, 'ResponseBody', BinaryToString($oRequest.ResponseBody))
	MsgBox(0, 'ResponseText', $oRequest.ResponseText)
EndIf
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
Так получил некоторые данные

Код:
---------------------------
ResponseHeaders
---------------------------
Cache-Control: private
Date: Tue, 19 Jan 2016 08:40:41 GMT
Content-Length: 76
Content-Type: text/html
Server: Microsoft-IIS/8.5
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
X-Powered-By: ARR/2.5
---------------------------
ОК   
---------------------------

Код:
---------------------------
ResponseBody
---------------------------
The server cannot service the request because the media type is unsupported.
---------------------------
ОК   
---------------------------

Код:
---------------------------
ResponseText
---------------------------
The server cannot service the request because the media type is unsupported.
---------------------------
ОК   
---------------------------
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Может здесь <asm_unit_testing>int</asm_unit_testing> нужно вместо INT поставить какой нибудь номер?. Как сказано в этой строке: The placeholders shown need to be replaced with actual values.
Или вообще заменить весь блок
Код:
	    <GetConfigDefinition xmlns="http://wibswebservice.dl">
      <asm_unit_testing>int</asm_unit_testing>
    </GetConfigDefinition>
на
Код:
    <GetProductInfo xmlns="http://depo.ru/">
      <serial_number>382117-001</serial_number>
    </GetProductInfo>


Добавлено:
Сообщение автоматически объединено:

Или измените Content-Type на text/xml; charset=utf-8
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
Помогла замена "Content-Type" на "text/xml; charset=utf-8", теперь ResponseBody и ResponseText выдают сообщение
Код:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><s:Fault><faultcode xmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none">a:ActionNotSupported</faultcode><faultstring xml:lang="ru-RU">The message with Action '' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver.  Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).</faultstring></s:Fault></s:Body></s:Envelope>

Мне это мало о чем говорит, побеседовал с разработчиками по поводу предположения о недостаче частей в теле запроса, получил ответ "Поставь себе WCFStorm
http://www.wcfstorm.com/wcf/home.aspx Сделай через него запрос к сервису и сними дамп запроса через Fiddler". Пока разбираюсь что это за утилиты и как с ними работать.


Добавлено:
Сообщение автоматически объединено:

После работы с фидлером оказалось что нужно отключить шифрование и изменить тело запроса.
Получился вот такой рабочий вариант
Код:
$data = '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetProductInfo xmlns="http://depo.ru/"><serial_number>382117-001</serial_number></GetProductInfo></s:Body></s:Envelope>'
$Link = 'http://wibsmanufacturing.dl:8083/ManufacturingService.svc'
$oRequest = ObjCreate('WinHttp.WinHttpRequest.5.1')
$oRequest.Open('POST', $Link)
$oRequest.SetRequestHeader('Content-Type', 'text/xml; charset=utf-8')
$oRequest.SetRequestHeader('SOAPAction', 'http://depo.ru/IManufacturingService/GetProductInfo')
$oRequest.Send($data)
If @error Then
    MsgBox(0, 'Ощибка', '0x' & Hex(@error))
Else
    MsgBox(0, 'ResponseHeaders', $oRequest.GetAllResponseHeaders)
    MsgBox(0, 'ResponseBody', BinaryToString($oRequest.ResponseBody))
    MsgBox(0, 'ResponseText', $oRequest.ResponseText)
EndIf


Спасибо за помощь
 
Верх