Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[JAVA] Http post naar phprestsql

Pagina: 1
Acties:

  • Biersteker
  • Registratie: Juni 2009
  • Laatst online: 21:47
Ik zit nu al een paar dagen met een probleem met het posten van data naar phprestsql.
Via apikitchen.com is het geen probleem, maar vanuit java, gaat er toch iets mis. Alle verzonden strings komen namelijk in de eerste rij. In de vorm van name: Henk&achternaamHenksma. Als ik het verstuur via apikitchen.com als body in de vorm
name=henk
achternaam=henksma
Kom het perfect in de db.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        HttpClient httpClient = new DefaultHttpClient();
        InputStream is = null;
        try {
            HttpPost httppost = new HttpPost("http://url");
            
            ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("name", "henk"));
            nameValuePairs.add(new BasicNameValuePair("achternaam","henksma"));
            
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));
       
        HttpResponse response = httpClient.execute(httppost);

        HttpEntity entity = response.getEntity();
            is = entity.getContent();
            Log.d("HTTP", "HTTP: OK");
        } catch (Exception e) {
            Log.e("HTTP", "Error in http connection " + e.toString());
        } finally {
            httpClient.getConnectionManager().shutdown();
        }
    }

Ik denk zelf dat het probleem erin zit dat ik het niet als Body van de HTTP post verstuur.
Ik kom er even niet meer uit. :F
(Heb ook hetzelfde gedaan alleen dan als JSON object, gaf exact hetzelfde probleem)

[ Voor 3% gewijzigd door Biersteker op 08-02-2013 20:45 ]

Originally, a hacker was someone who makes furniture with an axe.


  • Lone Gunman
  • Registratie: Juni 1999
  • Niet online
Je huidige code stopt de name/value paren netjes in de body, daar ligt het probleem niet.
Het probleem is dat de content van de body een andere encoding heeft dan wat phprestsql verwacht.

Jouw code past de standaard urlencoded form encoding toe, dwz: name=value&name=value... met name en value url encoded. Volgens de documentatie van phprestsql verwacht deze echter de volgende encoding: name=value<lf>name=value<lf>... waarbij name en value url encoded zijn (<lf> is een newline/line feed) .
Wat de motivatie van de schrijver(s) van phprestsql is om een niet standaard encoding te gebruiken is me niet echt duidelijk, maar het gevolg is dat clients geen gebruik kunnen maken van standaard apis voor het posten van formdata.

Om dit op te lossen kun je verschillende dingen doen: of je past phprestsql aan zodat deze de standaard encoding accepteert of je past je eigen code aan. Het eerste lijkt mij beter (tenzij de afwijkende encoding een belangrijke reden heeft) aangezien het dan ook simpel samenwerkt met andere client apis.

Als je liever je java code aanpast moet je de UrlEncodedFormEntity die je meegeeft aan setEntity vervangen door een eigen implementatie of gebruik maken van simpelere, bestaande Entities.

Quick and dirty voorbeeld (niet getest)
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
HttpPost httppost = new HttpPost("http://url");

ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("name", "henk"));
nameValuePairs.add(new BasicNameValuePair("achternaam","henksma"));

StringBuilder content = new StringBuilder();

for (NameValuePair pair : nameValuePairs) {
    String encodedName = URLEncoder.encode(pair.getName(), "UTF-8");
    String encodedValue = URLEncoder.encode(pair.getValue(), "UTF-8");

    if(content.length() > 0) {
        content.append("\n");
    }

    content.append(encodedName);
    content.append("=");
    content.append(encodedValue);
}

httppost.setEntity(new StringEntity(content.toString(), "UTF-8"));

Experience has taught me that interest begets expectation, and expectation begets disappointment, so the key to avoiding disappointment is to avoid interest.