PHP Curl возвращает пустую строку в браузере, работает в почтальоне - PullRequest
1 голос
/ 14 июня 2019

У меня есть некоторый код Php Curl, который был настроен Postman, мой вызов API SOAP отлично работает на Postman, но при перемещении его в браузер я получаю пустую строку

Я протестировал изменение TEXT / XMLв JSON, так как у меня аналогичный вызов, работающий на 100% в JSON / APPLICATION, а также на нескольких языках, но все, кажется, возвращают пустую строку.

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://example.com/webservice.cfc?Wsdl=",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:hs=\"https://example.com/webservice.cfc?Wsdl\">\n    <soapenv:Body>\n        <hs:examplecall>\n            <hs:ws_username>xxx</hs:ws_username>\n            <hs:ws_password>xxx</hs:ws_password>\n            <hs:exampleparam>xxx</hs:exampleparam>\n        </hs:examplecall>\n    </soapenv:Body>\n</soapenv:Envelope>",
  CURLOPT_HTTPHEADER => array(
    "Accept: */*",
    "Cache-Control: no-cache",
    "Connection: keep-alive",
    "Content-Type: text/xml",
    "Postman-Token: xxx",
    "User-Agent: PostmanRuntime/7.13.0",
    "accept-encoding: gzip, deflate",
    "cache-control: no-cache",
    "content-length: 445",
    "cookie: CFID=xxx; CFTOKEN=xxx"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}

почтальон возвращает мне именно то, что я ищу, ноПриведенный выше код, сгенерированный почтальоном, возвращает пустую строку без ошибок, поэтому мне не на что идти.

Ответы [ 2 ]

3 голосов
/ 14 июня 2019

Это вызов SOAP. Вы можете попробовать что-то вроде этого:

$client = new SoapClient('https://example.com/webservice.cfc?Wsdl');

$response = $client->examplecall(
        [
            'ws_username' => 'some_username',
            'ws_password' => 'some_pass',
            'exampleparam' => 'some_param'
        ]
);

print_r($response);
0 голосов
/ 20 июня 2019

Все заработало и вернулось так, как я хочу - проблема была в том, что формат XML не соответствовал файлу WSDL.Я не уверен, почему, но почтальон также добавил знак = в конце WSDL, и формат XML был другим - вот код, используемый для его работы:

<?php

$xml_data = '
  <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:hs="https://example.com/webservice.cfc?Wsdl">
    <soapenv:Body>
        <hs:exampleCall>
            <hs:ws_username>UN</hs:ws_username>
            <hs:ws_password>PW</hs:ws_password>
            <hs:exampleParam>xxx</hs:exampleParam>
        </hs:exampleCall>
    </soapenv:Body>
</soapenv:Envelope>
';

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://example.com/webservice.cfc?Wsdl",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => $xml_data,
  CURLOPT_HTTPHEADER => array(
    "Content-Type: text/xml; charset=utf-8",
    "Postman-Token: xxx",
    "cache-control: no-cache",
    "SOAPAction: ;",
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  print_r($response);
}
...