python - '读取请求时出现异常','详细信息':'无法解码:java.io.StringReader@1aac9ea'},'状态':'失败'}
问题描述
我的第一个问题是,“无法解码:java.io.stringreader”是什么意思?
我的第二个问题是,为什么有些字符串有效而其他字符串无效?我猜python使用d0rked编码传递某些字符串存在问题?
我的第三个问题是,在将 XML 值传递给 REST 正文之前,我是否正确转换了它们?
我从目录中获取 XML 文件,解析 XML,然后将 REST 帖子填充到 ServiceNow 实例。本质上,我将大量旧票从一个系统带到另一个系统。我已经解决了出现特殊字符(如项目符号)的问题。但由于某种原因,我不断收到Cannot decode: java.io.stringreader@bleh
一些 XML 记录的错误,而不是其他记录。我尝试手动将该元素(请求)中的文本更改为一个单词,但没有成功。所以这让我相信它与编码有关。在我的回复中,我看到它都是按设计以 utf-8 格式发送的。我只是不明白问题是什么。而且它仅与请求元素有关。其他一切都完美无缺。
我尝试了无数种方法将解析的 XML 更改为字符串、文本、编码和解码。奇怪的是,所有其他转换为 .text 的 XML 元素都可以正常工作。这只是请求元素。
def restMessage(number, subject, queue, opendate, closedate, request, history, final, category, subcategory):
# Set the request parameters
import requests
url = 'https://*.service-now.com/api/now/import/sn_hr_core_mayo_case_import'
# Eg. User name="admin", Password="admin" for this code sample.
user = '*'
pwd = '*'
# Set proper headers
headers = {"Content-Type":"application/json","Accept":"application/json"}
# Build body
body = "{\"u_state\":\"3\",\"u_opened_at\":\""+opendate+"\",\"u_closed_at\":\""+closedate+"\",\"u_source\":\"Self Service\",\"u_hr_service\":\"e2e4665cdb4f77003693f8fdbf96198b\",\"u_topic_category\":\"cec4bc2d9f931200d9011977677fcfe8\",\"u_opened_for\":\""+subject+"\",\"u_subject_person\":\""+subject+"\",\"u_assigned_to\":\"system\",\"u_queue\":\""+queue+"\",\"u_assignment_group\":\"f65370019f22120047a2d126c42e705c\",\"u_correlation_id\":\""+number+"\",\"u_request\":\""+request+"\",\"u_archive_category\":\""+category+"\",\"u_archive_subcategory\":\""+subcategory+"\"}"
# Do the HTTP request
response = requests.post(url, auth=(user, pwd), headers=headers ,data=body)
# Check for HTTP codes other than 200
#if response.status_code != 200:
print('Status:', response.status_code, 'Headers:', response.headers, 'Error Response:', response.json())
# Toggle exit if you want to only do one record.
# exit()
# Decode the JSON response into a dictionary and use the data
data = response.json()
print("Data from response = " + str(data))
#---------parse XML files from directory-----------
import os
from xml.etree import ElementTree as ET
# files are in a sub folder where this script is being ran
path = "attachments"
total = 0
count = 0
# Get the total number of xml records
files = os.listdir(path)
for x in files:
if x.endswith(".xml"):
total += 1
for filename in os.listdir(path):
# Only get xml files
if filename.endswith(".xml"):
fullname = os.path.join(path, filename)
# This joins full path / filename to trigger parser
tree = ET.parse(fullname)
# print(etree.tostring(root, pretty_print=True))
# from xml.dom.minidom import parse
# dom = parse(fullname)
# print('<?xml version="{}" encoding="{}"?>'.format(dom.version, dom.encoding))
# Parse the files..
# Build tags from all the child elements in root IE: /CASE
print("tree Obj ID= " + str(tree))
qnumber = tree.find("NUMBER")
qstatus = tree.find("STATUS")
qqueue = tree.find("QUEUE")
qcategory = tree.find("CATEGORY")
qsubcategory = tree.find("SUB_CATEGORY")
qsubject = tree.find("USER_ID")
qopendate = tree.find("OPEN_DATE")
qclosedate = tree.find("CLOSE_DATE")
qrequest = tree.find("REQUEST")
qhistory = tree.find("HISTORY_RESPONSE")
qfinal = tree.find("FINAL_RESPONSE")
#Convert everything to strings
number = qnumber.text
status = qstatus.text
category = qcategory.text
subcategory = qsubcategory.text
queue = qqueue.text
subject = qsubject.text
opendate = qopendate.text
closedate = qclosedate.text
request = qrequest.text
history = qhistory.text
final = qfinal.text
# Convert Special Characters
# bad_chars = ['•','/']
# for i in bad_chars:
# request = request.replace(i, '-')
# # request = ''.join([i for i in p_request if i.isdigit()])
# request.encode(encoding='UTF-8')
print(request)
#Print case number to assist with knowing where in count
print("Case Number: " + number)
count += 1
print("Count: " + str(count))
print("Total: " + str(total))
restMessage(number, subject, queue, opendate, closedate, request, history, final, category, subcategory)
这是我在某些记录上得到的回应:
Status: 400 Headers: {'error': {'message': 'Exception while reading request', 'detail': 'Cannot decode: java.io.StringReader@1aac9ea'}, 'status': 'failure'}
使用那些有效的(没有明显原因):
Status: 201 Headers: {'import_set': 'ISET0010005', 'staging_table': 'sn_hr_core_*_case_import', 'result': [{'transform_map': '* Case Import', 'table': 'sn_hr_core_case', 'display_name': 'number', 'display_value': 'HRC0001165', 'record_link': 'https://*.service-now.com/api/now/table/sn_hr_core_case/a3669014db8777003693f8fdbf9619b4', 'status': 'ignored', 'sys_id': 'a3669014db8777003693f8fdbf9619b4', 'status_message': 'No field values changed'}]}
出于明显的原因,我删除了一些敏感信息。在这种情况下,您会看到一个 *。
这是 XML:
<?xml version="1.0" encoding="UTF-8"?>
<CASE>
<NUMBER>20514217</NUMBER>
<PARENT>
</PARENT>
<STATUS>1-CLOSED</STATUS>
<OPEN_DATE>12/01/2017 00:29:46</OPEN_DATE>
<CLOSE_DATE>12/05/2017 17:42:26</CLOSE_DATE>
<SOURCE>Self Service</SOURCE>
<PROCESS>HR INTERNAL REQUEST FORM</PROCESS>
<CATEGORY>HR Connect</CATEGORY>
<SUB_CATEGORY>Personnel Action Change/Update</SUB_CATEGORY>
<USER_ID>210140</USER_ID>
<LAST_NAME>Mickey mouse</LAST_NAME>
<FIRST_NAME>Mickey mouse</FIRST_NAME>
<SITUATION>SELECT...</SITUATION>
<PRIORITY>5 Days</PRIORITY>
<ADVISOR_NAME>Donald Duck</ADVISOR_NAME>
<TEAM>2 HR SRV CNTR PA</TEAM>
<NEXT_ACTION>
</NEXT_ACTION>
<PROCESS_STATUS>Verified</PROCESS_STATUS>
<TRANSFERT_DATE>
</TRANSFERT_DATE>
<DEADLINE>12/12/2017 17:07:12</DEADLINE>
<QUEUE>HR Internal Request</QUEUE>
<FROZEN_DATE>
</FROZEN_DATE>
<OTHER_EMPLOYEE_ID>210140</OTHER_EMPLOYEE_ID>
<REQUEST>Please complete a multi-add to this employee's record for the 11-29-2017 pay period. See attached request form with all pertinent PA details.
Thank you,
Donald Duck</REQUEST>
<HISTORY_RESPONSE>[2017-12-01 17:52:09 - Donald Duck] Thank you for contacting HR Connect, your request for Mickey mouse has been processed.
[2017-12-01 17:52:10 - Donald Duck] Thank you for contacting HR Connect, your request for Melissa A. Gilbertson has been processed.</HISTORY_RESPONSE>
<FINAL_RESPONSE>Thank you for contacting HR Connect, your request for Mickey mouse has been processed.</FINAL_RESPONSE>
</CASE>
--我添加了我认为问题所在的屏幕截图。看起来 ServiceNow json 解析器不喜欢 \n 的?(回程车厢).. 在我努力解决问题时,我会发布更多信息。
解决方案
这最终成为源 xml 记录中的编码问题。Python 无法翻译大量奇怪的垃圾字符。我创造了一种去除奇数字符的方法。这是我使用的代码...
def fix_multi_line_string(text):
'''Given a string input,
replace all unwanted characters with desginated replacements.
Return the fixed string.'''
char_map = {
'•': '-',
'\t': '',
'\n': '',
'\r': '',
'\u200b': '',
'"': "'",
'\ufffd': '',
'\uf0b7': '',
'\uf0a7': '',
'\uf071': '',
'\u25e6': '',
'\uf020': '',
'\u2265': '',
'\u200e': '',
'\uf0d8': '',
'\u2010': '',
'\uf04a': '',
'\u25fe': '',
'\u2610': '',
'\u2015': '',
'\u2612': '',
'\uf04c': '',
'\uf15c': '',
'\ue1ef': '',
'\u25b2': '',
'\U0001f609': '',
'\u2502': '',
'\uf02a': '',
'\uf0e0': '',
'\uf028': '',
'\u25a1': '',
'\ue0e8': '',
'\u2003': '',
'\uf0a0': '',
'\ue900': '',
'\ue901': '',
'\ue076': '',
'\ue1d9': '',
'\ue1ed': '',
'\u25bc': '',
'\uf073': '',
'\ue099': '',
'\uf0fc': '',
'\uf0df': '',
'\uff08': '',
'\u2002': '',
'\uf0e8': '',
'\uf07f': '',
'\uf06f': '',
'\u263a': '',
'\ue1b4': '',
'\ue1b4': '',
'\u2500': '',
'\uf084': '',
'\ue0ca': '',
'\U00100078': '',
'\uf027': '',
'\uf0ac': '',
'\U0001f604': '',
'\uff1f': '',
'\uff0c': '',
'\uff01': '',
'\u2219': '',
'\u2219': '',
'\U0001f60a': '',
'\uf0a8': '',
'\ue172': '',
'\ue080': '',
'\ue113': '',
'\ue1bc': '',
'\ue202': '',
'\u2190': '',
'\u2192': '',
'\uf076': '',
'\ue021': '',
'\uf06e': '',
'\uf030': '',
'\uf077': '',
'\uf111': '',
'\uf12a': '',
'\ue22a': '',
'\u2981': '',
'\uf02d': '',
'\uf037': '',
'///': ''
}
for char in char_map:
text = text.replace(char, char_map[char])
return text
推荐阅读
- c# - 如何在 C# 中使用多个 IF 条件
- scala.js - 如何在 scala.js 中访问 node.js process.env.ENV_VARIABLE?
- javascript - 如何根据特定用户输入在 JavaScript 中显示警报
- mysql - MySQL 是否支持数据结构(例如 AVL 树或堆)?
- windows - 安装 Xdebug 以在 VS Code 1.2.1 中使用
- javascript - 如何使用字符串访问嵌套对象值以便我可以编辑?
- python - 对最新推文的 Tweepy 回复进入循环
- python - 从绑定传递列表
- python - 使用 pandas.to_csv 时的奇怪字符
- apache-flink - Flink - 当没有以下事件时发出最后一个窗口