gpt4 book ai didi

android - 使用 MultiPartEntityBuilder 从 Android 发送 JSON 数据时,无法在 Flask 服务器中使用 get_json()

转载 作者:行者123 更新时间:2023-11-29 17:54:03 26 4
gpt4 key购买 nike

我正在尝试将 JSON 格式的字符串从 Android 设备发送到 Flask 服务器。我正在使用 Apache MultiPartEntityBuilder 进行发送,因为我还想在同一 http 发布消息中发送图像文件。我在发送和接收文件时没有问题,但由于某种原因,JSON 数据没有按照我在 Flask 端的预期进行处理。我期望可以使用 request.get_json() 在 Flask 中访问 JSON 数据,但由于某种原因,这什么也没给出。相反,JSON 数据似乎可以通过 request.form 访问。所以也许 Flask 服务器由于某种原因无法识别 JSON 数据。还是 request.get_json() 甚至可以处理多部分数据?

在 Android 中发送 JSON:

public void postJson() {

JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("message", "Hello World!");
} catch (JSONException e) {
e.printStackTrace();
}

try{
HttpClient httpclient = createHttpClient();
HttpPost httpPost = new HttpPost("http://server/jsontest/");

MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

builder.addTextBody("json", jsonObject.toString(), ContentType.APPLICATION_JSON);

httpPost.setEntity(builder.build());
HttpResponse response = httpclient.execute(httpPost);

int code = response.getStatusLine().getStatusCode();
Toast.makeText(getBaseContext(), "Status code = " + code, Toast.LENGTH_LONG).show();

} catch(Exception e){
Log.e(LOG_TAG, "Error in http connection" + e.toString());
}

}

在 FLASK 中接收 JSON:

from flask import Flask
from flask import jsonify
from flask import request

app = Flask(__name__)

if not app.debug:
import logging
from logging.handlers import RotatingFileHandler
file_handler = RotatingFileHandler('app.log', 'a', 1 * 1024 * 1024, 10)
file_handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s: %(message)s [in %(filename)s:%(lineno)d]'))
app.logger.setLevel(logging.DEBUG)
file_handler.setLevel(logging.DEBUG)
app.logger.addHandler(file_handler)
app.logger.info('App startup')

@app.route('/', methods=['GET', 'POST'])
def get_json():
app.logger.info('Start of get_json')

app.logger.info('Form data')
app.logger.info(request.form)

app.logger.info('Json data')
app.logger.info(request.get_json())

return 'OK'

日志文件内容:

2013-12-31 11:57:10,600 INFO: App startup [in app.py:15]
2013-12-31 11:57:10,622 INFO: Start of get_json [in app.py:19]
2013-12-31 11:57:10,624 INFO: Form data [in app.py:21]
2013-12-31 11:57:10,629 INFO: ImmutableMultiDict([('json', u'{"message":"Hello World!"}')]) [in app.py:22]
2013-12-31 11:57:10,632 INFO: Json data [in app.py:24]
2013-12-31 11:57:10,635 INFO: None [in app.py:25]

最佳答案

您正在使用 json 参数创建一个多部分编码的 POST 主体,这在您发布表单数据时非常有用。

要 POST just JSON(为了 request.jsonrequest.get_json() 工作),你必须只发布数据 < em>没有将其编码为多部分正文:

HttpClient httpclient = createHttpClient();
HttpPost httpPost = new HttpPost("http://server/jsontest/");

httpPost.setHeader(ContentType.APPLICATION_JSON);
httpPost.setEntity(jsonObject.toString());
HttpResponse response = httpclient.execute(httpPost);

请注意,您需要设置application/json 内容类型 header 。不太熟悉 Android Java 类,我猜 ContentType.APPLICATION_JSON 是一个 Header 对象,您可以直接在 httpPost 对象上设置。

关于android - 使用 MultiPartEntityBuilder 从 Android 发送 JSON 数据时,无法在 Flask 服务器中使用 get_json(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20856494/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com