c# - Pymysql - 数据包序列号错误 - 得到 1 预期 1
问题描述
我正在制作一个与烧瓶 api 通信以执行 sql 查询的移动应用程序。
我有一个非常奇怪的问题,当我启动flask web API并在浏览器中测试它时,一切正常,在这个例子中(这是一个检查用户名是否已经存在的方法)
http://NETWORK_IP_ADDRR/checkusr?username=someuser&token=sometoken
它返回:
{
"exists": "true"
}
现在如果我启动 Xamarin 移动应用程序,转到注册页面并检查用户是否已经存在,我在文本框中输入用户名“someuser”,它告诉我它不存在,当它明确指出它存在时以上。
现在我返回浏览器而不重新启动 api 并执行相同的原始调用:http://NETWORK_IP_ADDRR/checkusr?username=someuser&token=sometoken
现在它"exists": "false"
从浏览器本身返回
有趣的是,一旦我在 android 应用程序仍在运行时重新启动 API 并输入用户名“someuser”
/checkusr
在烧瓶中:
@app.route('/checkusr')
def CheckUsr():
username = request.args.get("username")
token = request.args.get("token")
dbnameconv = "default"
if token == clienttoken:
try:
### this is where the exception happens (it happens only when the API server
### is started before the app is deployed to the android emulator)
cursor.execute("select username from user where username=%s", (username))
print(cursor.mogrify("select username from user where username=%s", (username)))
dbname = cursor.fetchone()
dbnameconv = dbname[0]
except Exception as e:
print(e) ### Gives error: Pymysql - Packet sequence number wrong - got 1 expected 1
### numbers can vary depending on the situation
print(f"sent: {username} - from db: {dbnameconv}")
if username == dbnameconv:
return jsonify(
{"exists":"true"}
)
else:
return jsonify(
{"exists":"false"}
)
else:
return jsonify(
{"exists":"fail"}
)
这就是我在 C# (Xamarin) 中查询 API 的方式
// this is what happens on textchanged event in the register username screen of the app
bool Exists = await calls.CheckUsrAsync(UsrTB.Text, clienttoken);
// this is the CheckUsrAsync() method that is called asynchronously
public async Task<bool> CheckUsrAsync(string Username, string Token)
{
var request = (HttpWebRequest)WebRequest.Create($"{WEBAPIURL}/checkusr?username={Username}&token={Token}");
var response = (HttpWebResponse)(await request.GetResponseAsync());
var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
CheckForm form = JsonConvert.DeserializeObject<CheckForm>(responseString);
if (form.Exists == "fail")
{
return true;
}
bool Exists = Convert.ToBoolean(form.Exists);
return Exists;
}
我无法理解的是为什么 sql 查询仅在 api 在移动应用程序之后启动但可以通过浏览器查询直到移动应用程序连接到 API 时才有效(在应用程序之前启动的 api)
我没有将 API 托管在与 android 模拟器相同的机器上,flask 服务器在本地网络中以调试模式运行。
解决方案
推荐阅读
- hadoop - 构建 Impala 是否依赖于 Hive、HBase 和 Sentry?
- android - 实现搜索功能以通过特定的 TextView 在 ListView 中搜索
- c# - PDF 下载选项在 Xamarin 表单中使用的 pdf.js 中不起作用
- javascript - 无法将“super”与 JavaScript 类中原型对象上定义的函数一起使用
- bash - 命令“PWD=/proc/self/cwd another_executable”是什么意思?
- python - 在 Plotly 中更改/更新 xtick 标签和 ytick 标签的不一致
- alluxio - 为什么在Alluxio中写入writeType THROUGH后文件需要时间同步?
- reactjs - 等待调用完成,然后在 saga 中调度操作
- ruby-on-rails - 如何在 Rails 中将环境变量显示为组
- javascript - 数据表中的日期渲染和 new Date() 在 IE11 和 Safari 中不起作用