Почему мой запрос не достигает получателя?

Как исправить ошибку "TypeError: string indices must be integers, not 'str'" при отправке SOAP-запроса в Python? В моем коде возникает эта ошибка. 

```python
def test():
    wsdl_url = "http://блаблаблабла/?singleWsdl"
    
    xml_data = '''<soapenv:Envelope xmlns:soapenv="http://блаблаблабl.xmlsoap.org/soap/envelope/"  xmlns:obj="http://блаблаблабl/objects">
          <soapenv:Header/>
          <soapenv:Body>
             <obj:GetOutgoingTrafficRequest>
                <!--Optional:-->
                <obj:parameter>
                   <!--Optional:-->
                   <obj:messageInfo>
                      <!--Optional:-->
                      <obj:type>outgoingTrafficRequest </obj:type>
                      <!--Optional:-->
                      <obj:version>1.1</obj:version>
                      <!--Optional:-->
                      <obj:messageID>блаблаблабл</obj:messageID>
                      <!--Optional:-->
                      <!--Optional:-->
                      <obj:senderID>101</obj:senderID>
                      <obj:senderName>блаблаблаблт</obj:senderName>
                      <!--Zero or more repetitions:-->
                      <obj:receiverID>201</obj:receiverID>
                   </obj:messageInfo>
                </obj:parameter>
             </obj:GetOutgoingTrafficRequest>
          </soapenv:Body>
       </soapenv:Envelope>'''

    session = Se
```

Как поправить код, чтобы избежать данной ошибки?
  • 25 мая 2024 г. 12:21
Ответы на вопрос 2
Ошибка "TypeError: string indices must be integers, not 'str'" указывает на то, что в вашем коде вы обращаетесь к элементам строки, как если бы они были словарями. Это происходит в результате использования метода `json.loads()` для строкового объекта, который возвращает словарь. 

Чтобы избежать этой ошибки, убедитесь, что вы взаимодействуете с элементами строки как с обычными индексами (целыми числами), а не как с ключами словаря. 

В вашем примере кода, васев неправильно скопировала xml данные, которые записались с html escape. Используйте следующую xml строку:

```python
xml_data = '''<soapenv:Envelope xmlns:soapenv="http://блаблаблабl.xmlsoap.org/soap/envelope/"  xmlns:obj="http://блаблаблабl/objects">
          <soapenv:Header/>
          <soapenv:Body>
             <obj:GetOutgoingTrafficRequest>
                <!--Optional:-->
                <obj:parameter>
                   <!--Optional:-->
                   <obj:messageInfo>
                      <!--Optional:-->
                      <obj:type>outgoingTrafficRequest </obj:type>
                      <!--Optional:-->
                      <obj:version>1.1</obj:version>
                      <!--Optional:-->
                      <obj:messageID>блаблаблабл</obj:messageID>
                      <!--Optional:-->
                      <!--Optional:-->
                      <obj:senderID>101</obj:senderID>
                      <obj:senderName>блаблаблаблт</obj:senderName>
                      <!--Zero or more repetitions:-->
                      <obj:receiverID>201</obj:receiverID>
                   </obj:messageInfo>
                </obj:parameter>
             </obj:GetOutgoingTrafficRequest>
          </soapenv:Body>
       </soapenv:Envelope>'''
```

Также, предполагаю, что у вас не завершен код функции `test()`, после строки `session = Se`. Вам не хватает строки `session.post(wsdl_url, data=xml_data)`, чтобы отправить запрос. 

Поправленный код:

```python
import requests

def test():
    wsdl_url = "http://блаблаблабла/?singleWsdl"
    
    xml_data = '''<soapenv:Envelope xmlns:soapenv="http://блаблаблабl.xmlsoap.org/soap/envelope/"  xmlns:obj="http://блаблаблабl/objects">
          <soapenv:Header/>
          <soapenv:Body>
             <obj:GetOutgoingTrafficRequest>
                <!--Optional:-->
                <obj:parameter>
                   <!--Optional:-->
                   <obj:messageInfo>
                      <!--Optional:-->
                      <obj:type>outgoingTrafficRequest </obj:type>
                      <!--Optional:-->
                      <obj:version>1.1</obj:version>
                      <!--Optional:-->
                      <obj:messageID>блаблаблабл</obj:messageID>
                      <!--Optional:-->
                      <!--Optional:-->
                      <obj:senderID>101</obj:senderID>
                      <obj:senderName>блаблаблаблт</obj:senderName>
                      <!--Zero or more repetitions:-->
                      <obj:receiverID>201</obj:receiverID>
                   </obj:messageInfo>
                </obj:parameter>
             </obj:GetOutgoingTrafficRequest>
          </soapenv:Body>
       </soapenv:Envelope>'''

    session = requests.Session()
    response = session.post(wsdl_url, data=xml_data)
    print(response.text)

test()
``` 

Попробуйте исправленный код и убедитесь, что вы вызываете нужный метод для отправки запроса.
TypeError: string indices must be integers, not 'str'

Код ждет число, а вы ему текст. Возможно где-то вы число в кавычки взяли и оно передалось как строка.
Похожие вопросы