Я настраиваю веб-сервис для приема заказов от третьих лиц, и у меня возникли некоторые проблемы, некоторые странные ошибки. Я использую CodeIgniter с сервером NuSoap, обрабатывающим запрос. Они используют C # .NET 3.5 для отправки запроса. Каждый раз, когда они отправляют запрос через свое приложение, он возвращает ошибку: «Ссылка на объект не установлена для экземпляра объекта».
Я попросил их прислать мне запрос и ответ SOAP, и вот они (к сожалению, они являются собственностью, поэтому я не могу предоставить всю информацию, и я изменил некоторые имена)
<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://InspectionService/SendInspectionRequestTPA</Action>
<h:AuthenticateHeader xmlns="http://InspectionService/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:h="http://InspectionService/">
<UserName>USERNAME</UserName>
<Password>PASSWORD</Password>
</h:AuthenticateHeader>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SendInspectionRequestTPA xmlns="http://InspectionService/">
<RequesterName>Bob</RequesterName>
<RequesterExt>5555555555</RequesterExt>
<RequesterEmail>[email protected]</RequesterEmail>
<SaleDate>2013-08-04T00:00:00</SaleDate>
<VehicleYear>2010</VehicleYear>
<VehicleMake>MITSUBISHI</VehicleMake>
<VehicleModel>GALANT ES/SE</VehicleModel>
<Mileage>60000</Mileage>
<VIN>12341234123412341</VIN>
<ContractNumber>SEP00001025NVSC</ContractNumber>
<ClaimNumber>C000001061</ClaimNumber>
<InspectionType>Automotive</InspectionType>
<InspectionReason>
<anyType xsi:type="xsd:string">RIGHT FRONT WINDOW IS NOT WORKING</anyType>
<anyType xsi:type="xsd:string">MOTOR SHORTED</anyType>
<anyType xsi:type="xsd:string">REPLACE RIGHT FRONT WINDOW MOTOR</anyType>
<anyType xsi:type="xsd:string">THIS IS A TEST INSPECTION.</anyType>
</InspectionReason>
<RepairSite>CLAIM DEMO DEALER-SEP 2</RepairSite>
<Address1>ADDR</Address1>
<Address2 />
<City>OMAHA</City>
<State>NE</State>
<Zip>68144</Zip>
<Contact>JOE SERVICER</Contact>
</SendInspectionRequestTPA>
</s:Body>
</s:Envelope>
(Обратите внимание, что я удалил некоторые чувствительные строки в запросе и изменил другие)
И ответ:
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Header />
<SOAP-ENV:Body>... stream ...</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
(Изменить: это было частью нашей проблемы, поскольку этот ответ отладки был усечен компанией — поэтому мы никогда не получали фактическую информацию отладки с их стороны)
Дело в том, что этот запрос отлично работает (читай: как и ожидалось) при отправке через SOAPUI. Вот код из моего контроллера CodeIgniter:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Carwash extends CI_Controller
{
public function __construct()
{
parent::__construct();
error_reporting(0);
ini_set('display_errors','Off');
$ns = 'http://'.$_SERVER['HTTP_HOST'].'/carwash';
$ep = 'http://'.$_SERVER['HTTP_HOST'].'/carwash';
$this->ns = $ns;
$this->load->library("Nusoap_library"); // load nusoap toolkit library in controller
$this->nusoap_server = new soap_server(); // create soap server object
$this->nusoap_server->configureWSDL("EACCarwash", $this->ns, $ep); //, "rpc", 'http://schemas.xmlsoap.org/soap/http', array(),); // wsdl configuration
$this->nusoap_server->wsdl->schemaTargetNamespace = $ns; // server namespace
$this->nusoap_server->namespaces['soap'] ='http://schemas.xmlsoap.org/soap/encoding/';
$this->load->model('carwash_model');
}
public function index()
{
$fi_input = array(
"RequesterName" => "xsd:string",
"RequesterExt" => "xsd:string",
"RequesterEmail" => "xsd:string",
"ContractHolder" => "xsd:string",
"SaleDate" => "xsd:dateTime",
"SaleOdometer" => "xsd:string",
"VehicleYear" => "xsd:string",
"VehicleMake" => "xsd:string",
"VehicleModel" => "xsd:string",
"Mileage" => "xsd:string",
"VIN" => "xsd:string",
"ContractNumber" => "xsd:string",
"ClaimNumber" => "xsd:string",
"InspectionType" => "xsd:string",
"InspectionReason" => "xsd:struct",
"RepairSite" => "xsd:string",
"Address1" => "xsd:string",
"Address2" => "xsd:string",
"City" => "xsd:string",
"State" => "xsd:string",
"Zip" => "xsd:string",
"Phone" => "xsd:string",
"Contact" => "xsd:string",
"TpaCode" => "xsd:string");
$fi_return = array(
"SendInspectionRequestTPAResult" => "xsd:string");
$this->nusoap_server->register('SendInspectionRequestTPA',
$fi_input,
$fi_return,
"urn:SOAPServerWSDL",
"urn:".$this->ns."/SendInspectionRequestTPA",
"rpc",
"encoded",
"DESCRIPTION HERE",
"http://schemas.xmlsoap.org/soap/encoding/");
function SendInspectionRequestTPA($req_name, $req_ext, $req_email, $contract_holder, $sale_date, $sale_odometer, $v_year, $v_make, $v_model, $mileage, $vin, $contract_no, $claim_no, $insp_type, $insp_reason, $repair_site, $addr1, $addr2, $city, $state, $zip, $phone, $contact_name, $tpa_code)
{
$CI =& get_instance();
if($CI->check_creds() == FALSE)
{
return new soap_fault('Client','','Not authorized');
}
else
{
if(!$req_name){ return new soap_fault('Client','','Requester Name Required');}
if(!$sale_date){ return new soap_fault('Client','','Sale Date Required');}
if(!$v_year){ return new soap_fault('Client','','Vehicle Year Required');}
if(!$v_make){ return new soap_fault('Client','','Vehicle Make Required');}
if(!$v_model){ return new soap_fault('Client','','Vehicle Model Required');}
if(!$mileage){ return new soap_fault('Client','','Mileage Required');}
if(!$contract_no){ return new soap_fault('Client','','Contract Number Required');}
if(!$claim_no){ return new soap_fault('Client','','Claim Number Required');}
if(!$insp_type){ return new soap_fault('Client','','Inspection Type Required');}
if(!$insp_reason){ return new soap_fault('Client','','Inspection Reason Required');}
if(!$repair_site){ return new soap_fault('Client','','Repair Site Required');}
if(!$contact_name){ return new soap_fault('Client','','Contact Required');}
if(!$tpa_code){ return new soap_fault('Client','','TPA Code Required');}
$id = $CI->carwash_model->add_fni_insp($req_name, $req_ext, $req_email, $contract_holder, $sale_date, $sale_odometer, $v_year, $v_make, $v_model, $mileage, $vin, $contract_no, $claim_no, $insp_type, $insp_reason, $repair_site, $addr1, $addr2, $city, $state, $zip, $phone, $contact_name, $tpa_code) or die(new soap_fault('Server','','Error Processing Request'));
return (string) ((int) $id);
//else{return new soap_fault('Server', '','Error processing request');}
}
}
$this->soapy = file_get_contents("php://input");
$this->nusoap_server->service($this->soapy);
}
public function hookTextBetweenTags($string, $tagname) {
$pattern = "/<$tagname ?.*>(.*)<\/$tagname>/i";
preg_match($pattern, $string, $matches);
return $matches[1];
}
public function check_creds()
{
if(isset($this->soapy))
{
$sUsername = $this->hookTextBetweenTags($this->soapy, 'Username');
$sPassword = $this->hookTextBetweenTags($this->soapy, 'Password');
$verify = $this->carwash_model->check_fni_user($sUsername, $sPassword);
//var_dump($verify);
return $verify;
}
}
}//end class
Признаюсь, я относительно новичок в настройке SOAP-серверов, поэтому, если что-то действительно глупое или неуместное, я бы тоже очень хотел об этом услышать.
Когда я погуглил ошибку «Ссылка на объект не установлена для экземпляра объекта», кажется, что по сути сервер ожидал объект и не получил его. Единственное место, которое могло бы произойти, — это поле «инспекция», которое правильно сформировано в их запросе. Это единственное, что я могу точно определить, откуда возникла эта ошибка. Но поскольку он работает с SOAPUI, я склонен думать, что ошибка связана с запросом, а не с сервером.
Кто-нибудь видит какие-либо явные ошибки? Или есть что-то с NuSoap, что я должен настроить?
Дайте мне знать, если я могу предоставить более подробную информацию. Спасибо!
Задача ещё не решена.
Других решений пока нет …