我已经看到了这个问题的几个答案,但是没有一个解决方案与我的特定设置相似。我使用一个名为DbGate的Api发布值到数据库。我从浏览器发送的格式是这样的:
https://www.myurl.com/api/mssql/dbo/uspAddLaneTimings?laneSequence=2&rfidUniqueId=020047D0C653&planningLaneSeq=1&sensorId=202481599234152
当我通过在我的PC上的Chrome浏览器中输入URL或在我的树莓派上使用Chromium来运行这个时,它工作得很好。数据正确地发布到我的表中,并且浏览器使用添加的记录的ID进行响应:
{"value":[{"ID":18}]}
我正在尝试使用Python3从树莓派发送POST请求。这是我第一个Python项目。
SQL语句如下:
-- Add the parameters for the stored procedure here
@laneSequence int = 0,
@rfidUniqueId nvarchar(50) = '',
@planningLaneSeq nvarchar(10)= '',
@sensorId nvarchar(50) = ''
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
IF NULLIF(@laneSequence, '') IS NULL select @laneSequence = 0
if NULLIF(@rfidUniqueId, '') is null select @rfidUniqueId = 'null-recd'
if NULLIF(@planningLaneSeq, '') is null select @planningLaneSeq = 'null-recd'
if NULLIF(@sensorId, '') is null select @sensorId = 'null-recd'
--else
-- Insert statements for procedure here
INSERT INTO [dbo].[TBL_SS_LaneTimings]
([laneSequence]
,[timestamp]
,[rfidUniqueId]
,[planningLaneSeq]
,[sensorId]) output inserted.ID
VALUES
(@laneSequence
,getdate()
,@rfidUniqueId
,@planningLaneSeq
,@sensorId)
END
这是我发送它的方式(Python3):
def setup_http_request(rfidUniqueId, mac_address, my_id_count):
apiRequest = url + "?laneSequence=" + str(my_id_count) + "&rfidUniqueId=" + rfidUniqueId + "&planningLaneSeq=" + str(my_id_count) + "&sensorId=" + str(mac_address)
send_http_request(apiRequest)
def send_http_request(apiRequest):
try:
auth = HttpNtlmAuth(db_user,db_password)
response = requests.post(apiRequest,auth=auth)
我得到一个响应status_code为200,但我没有看到要返回的值,并且添加的记录显示所有字段都被接收为null。
通过首先打开sql server会话来解决这个问题:
session=requests()
session.auth = HttpNtlmAuth(db_user,db_password)
r=session.get(baseUrl)
然后我把我的。post改成。get。
response = session.get(apiRequest)
现在我得到了新记录ID和数据正确写入我的SQL表的值。