如何在具有Method的SOAP Web服务中传递参数?

时间:2016-09-02 04:27:57

标签: ios objective-c soap

我从未使用过基于SOAP的服务,我不确定是否使用了以下的SOAP服务。

http://workforce.wifisocial.in/WebServicesMethods/EmployeesWebService.asmx?op=EmployeesLoginMethod

在这项服务中,我需要使用以下参数传递4个值: 用户名,密码,ipaddress和devicename。 输出采用JSON格式。

请帮助达到预期的效果。

3 个答案:

答案 0 :(得分:1)

您只需要一个HTTP post请求并传递正确的XML数据并设置HTTP标头:

func soapRequest(username:String, password:String, ipAddress:String, deviceName:String){
        if let url = NSURL.init(string: "http://workforce.wifisocial.in/WebServicesMethods/EmployeesWebService.asmx"){
            let request = NSMutableURLRequest(URL: url)
            let requestBody = "<?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><EmployeesLoginMethod xmlns=\"http://tempuri.org/\"><username>\(username)</username><password>\(password)</password><IpAddress>\(ipAddress)</IpAddress><deviceName>\(deviceName)</deviceName></EmployeesLoginMethod></soap:Body></soap:Envelope>"
            request.HTTPMethod = "POST"
            request.HTTPBody = requestBody.dataUsingEncoding(NSUTF8StringEncoding)
            request.setValue("text/xml", forHTTPHeaderField: "Content-Type")
            request.setValue("\"http://tempuri.org/EmployeesLoginMethod\"", forHTTPHeaderField: "SOAPAction")
            NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { (data, response, error) in
                guard error == nil && data != nil else{
                    //handle error
                    return
                }
                if let responseString = String.init(data: data!, encoding: NSUTF8StringEncoding){
                    print("\(responseString)")
                }
                //..........
                //Parse your XML response data
                //.........
            }).resume()
            
        }
        
    }

答案 1 :(得分:1)

愿这会帮到你

以下是在Objective-C中调用SOAP的方法:

NSURL *baseURL = [NSURL URLWithString:@"http://yourbaseURLxxxxxxxx"];

    NSString *sSOAPMessage = [NSString stringWithFormat: @"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
                              "<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/\">\n"
                              "<soap:Body>\n"
                              "<EmployeesLoginMethod xmlns=\"http://tempuri.org/\">"
                              "<username>iamiosguy@gmail.com</username>"
                              "<password>lovetocode</password>"
                              "<ipaddress>192.16.0.0</ipaddress>"
                              "<devicename>iPhone7</devicename>"
                              "</EmployeesLoginMethod>"
                              "</soap:Body>\n"
                              "</soap:Envelope>\n"];

    NSLog(@"-----Developed Envelope----%@",sSOAPMessage);



    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:baseURL];

    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:[sSOAPMessage dataUsingEncoding:NSUTF8StringEncoding]];
    [request addValue:@"http://tempuri.org/IService/EmployeesLoginMethod" forHTTPHeaderField:@"SOAPAction"];
    [request addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
        NSLog(@"Data string = %@",string);

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"%s: AFHTTPRequestOperation error: %@", __FUNCTION__, error);
    }];

    [operation start];

答案 2 :(得分:0)

输出也将是我在服务定义中看到的肥皂。

我假设您想要使用c#从另一台服务器调用该函数,截至编写时,没有任何关于所用技术的指示。您需要添加wcf引用并使用生成的类调用该方法。

  

在当前解决方案中添加对服务的引用   在“解决方案资源管理器”中,右键单击要将服务添加到的项目的名称,然后单击“添加服务引用”。   将出现“添加服务引用”对话框。   单击发现。   当前解决方案中的所有服务(包括WCF数据服务和WCF服务)都将添加到“服务”列表中。   在“服务”列表中,展开要使用的服务的节点,然后选择实体集。   在“命名空间”框中,输入要用于引用的命名空间。   单击“确定”以添加对项目的引用。   生成服务客户端(代理),并将描述该服务的元数据添加到app.config文件中。

MSDN How to: Add, Update, or Remove a WCF Data Service Reference

如果您是从javascript发布的,这里有一个vanilla js示例。

&#13;
&#13;
var soap_post_body = ""+
'<?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>'+
'    <EmployeesLoginMethod xmlns="http://tempuri.org/">'+
'      <username>string</username>'+
'      <password>string</password>'+
'      <IpAddress>string</IpAddress>'+
'      <deviceName>string</deviceName>'+
'    </EmployeesLoginMethod>'+
'  </soap12:Body>'+
'</soap12:Envelope>';

xhr = new XMLHttpRequest();
xhr.open('POST', 'http://workforce.wifisocial.in/WebServicesMethods/EmployeesWebService.asmx');
xhr.setRequestHeader('Content-Type', 'application/soap+xml; charset=utf-8');
xhr.onload = function() {
    if (xhr.status === 200) {
        console.log(xhr.responseText);
    }
    else {
        console.log(xhr.status);
    }
};
xhr.send(encodeURI(soap_post_body));
&#13;
&#13;
&#13;