SOAP-запрос на переключение Wemo с Pebble возвращает статус 500

Я пытался написать приложение для камуфляжа, в настоящее время это код, который я использую:

function WemoRequest(callback) {
    if (SOAPData === false || SOAPData === undefined) {
        console.log("Invalid SOAP data: " + JSON.stringify(SOAPData));
        return;
    }

var url = "http://192.168.1.230:49153/upnp/control/basicevent1";

try {
    var request = new XMLHttpRequest();
    request.open("POST", url, false);
    request.setRequestHeader("SOAPAction", "urn:Belkin:service:basicevent:1#GetBinaryState");
    request.setRequestHeader("Content-Type",  "text/xml; charset=utf-8");
    request.onreadystatechange = function() {
    if (request.readyState == 4 && request.status === 200 && callback) {
            callback(request, SOAPData);
            }else{console.log("Status: "+request.status + " State: "+request.readyState+" Callback: "+callback);}
    };
    var packet = '<?xml version="1.0" encoding="utf-8"?>'+
            '<s:Envelope xmls:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">'+
        '<s:Body>'+
            '<u:GetBinaryState xmlns:u="urn:Belkin:service:basicevent:1"></u:GetBinaryState>'+
        '</s:Body>'+
    '</s:Envelope>';

    request.send(packet);
} catch (error) {
    console.log("Error in XMLHttpRequest: " + error);
}}

В настоящее время я получаю статус 500 от OnReadyStateChange и понятия не имею, что я делаю неправильно. Если этого кода недостаточно, код приложения доступен здесь: https://github.com/dmf444/Webble

0 ответов

Итак... Я знаю, что это 4 года назад, лол, но я нашел это во время поиска в Google и только что нашел ответ, поэтому я решил, что отвечу по этой причине: я думаю, что вашему заголовку просто нужен дополнительный набор цитат вокруг "urn:Belkin:service:basicevent:1#SetBinaryState", так что строка, определяющая мыльное действие, буквально начинается и заканчивается кавычками.

Я работаю на Python (потому что это то, чем, кажется, сейчас все дети делают), но я тоже получал ошибку 500, пока не сделал очень тонкое изменение (одинарные кавычки вокруг моих двойных кавычек) и чуть не заплакал радости, когда мой свет погас:

"SOAPACTION": '"urn:Belkin:service:basicevent:1#SetBinaryState"'

Итак, вот рабочая версия кода (на Python lol):

import http.client

#Variables (value=on/off, ipaddress=address of your wemo)
value = 0 #1=ON, 0=OFF
ipAddress = "192.168.0.108"

#Build the SOAP Envelope (data)
data = '<?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:SetBinaryState xmlns:u="urn:Belkin:service:basicevent:1"><BinaryState>' + str(value) + '</BinaryState></u:SetBinaryState></s:Body></s:Envelope>'

#Build the Header (headers)
headers = {"Content-type" : 'text/xml; charset="utf-8"', "SOAPACTION": '"urn:Belkin:service:basicevent:1#SetBinaryState"', "Content-Length": len(data)}

#Send request and check response data (resp_data)
conn = http.client.HTTPConnection(ipAddress, 49153)
conn.request("POST", "/upnp/control/basicevent1", data, headers)
response = conn.getresponse()
resp_data = response.read()

if response.status == 200:
    conn.close()
    print("SUCCESS!")
elif response.status == 403:
    print("ERROR: 403 (FORBIDDEN)")
else:
    print("ERROR: " + str(response.status))
Другие вопросы по тегам