简体   繁体   English

为什么无法将此Python POST请求转换为Java?

[英]Why does converting this Python POST request to Java not work?

I'm trying to convert this Python code using the Python Requests HTTP library into Java code (for Android). 我正在尝试使用Python Requests HTTP库将此Python代码转换为Java代码(适用于Android)。

import requests
payload = {"attr[val1]":123,
           "attr[val2]":456,
           "time":0,
           "name":"Foo","surname":"Bar"}

r = requests.post("http://jakiro.herokuapp.com/api", data=payload)
r.status_code
r.text

This is what I've done so far: 到目前为止,这是我所做的:

protected void sendJson() {
    Thread t = new Thread() {

        public void run() {
            Looper.prepare(); //For Preparing Message Pool for the child Thread
            HttpClient client = new DefaultHttpClient();
            HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000); //Timeout Limit
            HttpResponse response;
            JSONObject json = new JSONObject();

            try {
                Log.v("SOMETHING_NAME3", "Creating POST");
                HttpPost post = new HttpPost("http://jakiro.herokuapp.com/api");
                json.put(MessageAttribute.SURNAME, "Bar");
                json.put(MessageAttribute.VAL1, 123);
                json.put(MessageAttribute.VAL2, 456);
                json.put(MessageAttribute.name, "Foo");
                json.put(MessageAttribute.TIME, 0);
                StringEntity se = new StringEntity( json.toString() );
                se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
                post.setEntity(se);
                response = client.execute(post);

                /*Checking response */
                if(response!=null){
                    InputStream in = response.getEntity().getContent(); //Get the data in the entity
                    String foo = convertStreamToString(in);
                    Log.v("SOMETHING_NAME2", foo); // Gives me "Bad request"
                }

            } catch(Exception e) {
                e.printStackTrace();
                Log.v("SOMETHING_NAME", "Cannot Establish Connection");
            }

            Looper.loop(); //Loop in the message queue
        }
    };

    t.start();
}

I've checked the response with response.getStatusLine().getStatusCode() and I get back a 400 from the server. 我已经用response.getStatusLine().getStatusCode()检查了响应,然后从服务器取回了400。 The Python code works fine, but in Java on an Android device it doesn't. Python代码可以正常工作,但在Android设备上的Java中则不能。 I can't see to figure out why though. 我看不出为什么。

@Blender's link was the correct solution at the link: How to use parameters with HttpPost @Blender的链接是该链接上的正确解决方案: 如何在HttpPost中使用参数

The correct way to url-encode was to create BasicNameValuePairs and encode that as such: url编码的正确方法是创建BasicNameValuePairs并将其编码为:

postParameters = new ArrayList<NameValuePair>();
postParameters.add(new BasicNameValuePair("param1", "param1_value"));
postParameters.add(new BasicNameValuePair("param2", "param2_value"));

httppost.setEntity(new UrlEncodedFormEntity(postParameters));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM