服务器连接和读/写值

2024-06-16 10:43:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我想通过构造函数提供的API(类似RESTful)从PLC读取写值。你知道吗

第一步是身份验证 Ajax代码

$.ajax({
url: "http://192.168.10.11/sdcard/cpt/app/signin.php",
type: 'POST', dataType: 'json',data: {
'user[name]': 'admin',
'user[password]': 'hellocpt'
}
}).done(function(data) {
console.debug("signin done");
});

接下来我可以从JSON读取值

var url='http://192.168.10.11/sdcard/cpt/app/data_api.php?
url=/app/objects/EasyIO/Ramp.out';
$.ajax(
{url: url, type: 'GET', dataType: 'json'}
).done(function(data) {console.debug(data);});

回应

{
"response" : {
"resultCode" : 0, // '0' for success, other numbers for
failure
"data" : [ // sedona object data is orgnized in list
{ // every object's data is a dictionary
"path" : "/EasyIO/Ramp", //sedona object's path
"slots" : [ //slots data is organized as a list
{
"value" : "49.000000", // 'out' slot's value
"slotType" : "property", // this slot is a
property
"name" : "out", // slot's name"type" : "float" // slot value's data type
}
]
}
]
}
}

司令部

var url = 'http://192.168.10.11/sdcard/cpt/app/data_api.php';
$.ajax({url: url,
type: 'POST',
dataType: 'json',
data: {
path: '/app/objects/EasyIO/WriteIn.in',
type: 'int',
value: '100',
slotType: 'property'
}
}).done(function(data) {
console.debug(data);
});

回应

{
"response" : {
"resultCode" : 0, // '0' for success, other numbers for
failure
"value" : "100", // slot value has been changed to '100'
"type" : "int", // slot data type is 'int'
"path" : "/app/objects/EasyIO/WriteIn.in" //slot's path
}
}

这个API documentation

这是我的python3代码测试

import os
import requests
import pycurl
import json
import urllib
from urllib.request import urlopen


headers = {
    'X-Requested-With': 'XMLHttpRequest',
}

data = [
  ('user[name]', 'admin'),
  ('user[password]', 'hellocpt'),
]

response = requests.post('http://192.168.0.230/sdcard/cpt/app/signin.php', headers=headers, data=data)
print("Code Status du POST: ",response.status_code)
print(response.content)


cookies = {
}

params = (
    ('url', '/app/objects/EasyIO/Ramp.out'),
)

responseget = requests.get('http://192.168.0.230/sdcard/cpt/app/data_api.php', headers=headers, params=params, cookies=cookies)
print("\n\nCode Status du GET: ",responseget.status_code)
print(responseget.content)

以及我的输出

    Code Status du POST:  200
b'{"redirectUrl": "http://192.168.0.230/sdcard/cpt/dashboard/index.php" }'


Code Status du GET:  200
b'{"redirect": "http://192.168.0.230/sdcard/cpt/app/signin.php"}'

我的问题是我不明白为什么我的POST命令工作,但当我发出GET命令时,我看到重定向到signin页面链接。为什么要注销?你知道吗

有人能帮忙吗?你知道吗

谢谢


Tags: importapphttpurldatavalueresponsetype
1条回答
网友
1楼 · 发布于 2024-06-16 10:43:17

当您发送第二个请求(GET)时,服务器如何知道您以前已登录?服务器在第一个请求中向您发回一些内容,您应该在第二个请求中向服务器发回这些内容,以便服务器可以对您进行身份验证。你知道吗

我无法使用您发布的ajax代码了解您的API是如何工作的,因为返回的数据没有显示在第一个请求中,但是如果我们假设身份验证是基于cookie的,那么您应该替换此行,而不是空cookie:

cookies = {
}

有了这个:

cookies = response.cookies

但这只是一个示例,您的API可能会返回一个令牌,而不是使用cookie或文档中指定的其他类型的身份验证。你知道吗

编辑:我能够打开包含API文档的pdf文件,而且似乎验证是基于cookie的,所以解决方案应该可以工作。你知道吗

相关问题 更多 >