Pedido SOAP em Flutter / Dart

votos
0

Eu preciso fazer uma solicitação SOAP para um .NET Webservice (WSDL) com vibração.

Este webservice tem uma autenticação básica (usuário, senha) e alguns serviços com envelopes pré-definidos.

Então, eu tentei criar um envelope SOAP:

String requestBody = <soapenv:Envelope xmlns:soapenv=\http://schemas.xmlsoap.org/soap/envelope/\ xmlns:tot=\http://www.totvs.com/\>   <soapenv:Header/>   <soapenv:Body>      <tot:RealizarConsultaSQL>         <!--Optional:-->         <tot:codSentenca>ETHOS.TESTE</tot:codSentenca>         <!--Optional:-->         <tot:codColigada>0</tot:codColigada>         <!--Optional:-->         <tot:codSistema>F</tot:codSistema>         <!--Optional:-->         <tot:parameters></tot:parameters>      </tot:RealizarConsultaSQL>   </soapenv:Body></soapenv:Envelope>;

Este envelope é válido. O segundo passo foi fazer uma conexão http:

http.Response response = await http.post(
  request,
  headers: {
    Accept-Encoding: gzip,deflate,
    Content-Length: utf8.encode(requestBody).length.toString(),
    Content-Type: text/xmlc,
    SOAPAction: http://www.totvs.com/IwsConsultaSQL/RealizarConsultaSQL,
    Authorization: Basic bWVzdHJlOnRvdHZz,
    Host: totvs.brazilsouth.cloudapp.azure.com:8051,
    Connection: Keep-Alive,
    User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
  },
  body: utf8.encode(requestBody),
  encoding: Encoding.getByName(UTF-8)).then((onValue)
{
  print(Response status: ${onValue.statusCode});
  print(Response body: ${onValue.body});
 });

Neste ponto eu só recebem 411 código:

<hr><p>HTTP Error 411. The request must be chunked or have a content length.</p>

Então, eu tenho 2 grandes dúvidas:

  1. Como posso passar autenticação (usuário / senha);
  2. Por que, mesmo a criação Content-Length codificado sempre voltar 411.

Eu sou novo no Dart / Flutter

Publicado 27/11/2018 em 18:05
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

Você está definindo muitas cabeçalhos, como a maioria deles será definido pelo cliente - nomeadamente o comprimento de conteúdo e codificação.

Seu cabeçalho autenticação básica parece OK.

Não misture awaite then- usar um ou o outro.

Você pode simplificar o seu código para:

import 'dart:convert';
import 'package:http/http.dart' as http;

main() async {
  String soap = '''<?xml version="1.0"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                  xmlns:tot="http://www.totvs.com/">
  <soapenv:Header/>
  <soapenv:Body>
    <tot:RealizarConsultaSQL>      
      <tot:codSentenca>ETHOS.TESTE</tot:codSentenca>    
      <tot:codColigada>0</tot:codColigada>       
      <tot:codSistema>F</tot:codSistema>       
      <tot:parameters></tot:parameters>
    </tot:RealizarConsultaSQL>
  </soapenv:Body>
</soapenv:Envelope>''';

  http.Response response = await http.post(
    'http://totvs.brazilsouth.cloudapp.azure.com:8051/wherever',
    headers: {
      'content-type': 'text/xmlc',
      'authorization': 'bWVzdHJlOnRvdHZz',
      'SOAPAction': 'http://www.totvs.com/IwsConsultaSQL/RealizarConsultaSQL',
    },
    body: utf8.encode(soap),
  );
  print(response.statusCode);
}

Cuidado que Dart httpcaixa baixa todos os nomes de cabeçalho (como permitido pela RFC), mas isso confunde alguns servidores.

Tente o seu pedido através do carteiro. Se você pode fazê-lo funcionar lá, editar a pergunta mostrando um bom pedido Postman (ou outro idioma).

Respondeu 28/11/2018 em 02:59
fonte usuário

votos
0

Depois de muitas horas spended em testes, eu tenho sucesso usando este cabeçalho:

     "SOAPAction": "http://www.totvs.com/IwsConsultaSQL/RealizarConsultaSQL",
    "Content-Type": "text/xml;charset=UTF-8",
    "Authorization": "Basic bWVzdHJlOnRvdHZz",
    "cache-control": "no-cache"

Ele emendas que Content-Length é enviar automaticamente, por isso, o código que trabalhou é esta:

  http.Response response = await http.post(
      request,
      headers: {
        "SOAPAction": "http://www.totvs.com/IwsConsultaSQL/RealizarConsultaSQL",
        "Content-Type": "text/xml;charset=UTF-8",
        "Authorization": "Basic bWVzdHJlOnRvdHZz",
        "cache-control": "no-cache"
      },
      body: utf8.encode(requestBody),
      encoding: Encoding.getByName("UTF-8")
  ).then((onValue)
  {
    print("Response status: ${onValue.statusCode}");
    print("Response body: ${onValue.body}");

  });

Obrigado a todos pela ajuda, eu tenho a solução por um código Postman, como sugerido antes, obrigado.

Respondeu 03/12/2018 em 18:07
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more