Использование команд cURL в Android

У меня есть следующая команда cURL, и я хотел бы выполнить то же самое с Android,

curl -X POST -H "Content-Type: application/json" -d 

'{"username":"user","password":"pass"}' 

http://www.somesite.com/login

Это то, что я сделал для Андорида,

    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://www.somesite.com/login");

    try {

        httppost.addHeader("Content-Type", "application/json");

        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
        nameValuePairs.add(new BasicNameValuePair("username", "user"));
        nameValuePairs.add(new BasicNameValuePair("password", "pass"));

       httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, HTTP.UTF_8));

        HttpResponse response = httpclient.execute(httppost);

         Log.d("RESPOND", EntityUtils.toString(response.getEntity()));

    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
    } catch (IOException e) {
        // TODO Auto-generated catch block
    }

Когда я запускаю приложение, я получаю всю страницу в качестве ответа вместо желаемого массива JSON. Я новичок в cURL и понятия не имею, что не так с кодом.


person Falling Into Infinity    schedule 05.07.2014    source источник
comment
дубликат stackoverflow.com/questions /2323617/   -  person CommonsWare    schedule 06.07.2014


Ответы (1)


Используйте JSONObject вместо простого списка пар имя/значение.

Используйте StringEntity вместо UrlEncodedFormEntity.

Создайте JsonObject, обертывающий ваши строки KV, а затем используйте «запись», чтобы сбросить объект в строку в форме StringEntity в запросе POST в httpclient.

некоторый соответствующий код, использующий «Джексон» для реализации JsonObj и https://code.google.com/p/httpclientandroidlib/.

      ObjectNode rootOb = new ObjectMapper().createObjectNode();
      rootOb.put("username",user );
...         
        StringWriter writer = new StringWriter();
        try {
            new ObjectMapper().writeValue(writer, rootOb);
        } catch (JsonGenerationException e) {

        }
        String poststr=writer.toString();           
         new HttpConnection(handler4).post(url, poststr);
...
        httpPost.setEntity(new StringEntity(poststr));

тестирование с помощью curl -VERBOSE сначала, а затем просто повторно реализовать именно завиток в Android, является очень хорошей техникой, если вы можете включить LOGGER в httpclient Android, который дает вам ведение журнала на уровне HEADER / WIRE, когда вам нужно проверить, что ваш Android делает ТОЧНО или почти точно то, что делал ваш клиент Curl.

приведенный ниже пример выражения curl, за которым следуют журналы Android (WIRE/HEADERS), показывающие аналоги Android того же материала, который вы отправляли с помощью Curl.

curl -v -X POST \
  -H "X-Parse-Application-Id: LAbR" \
  -H "X-Parse-REST-API-Key: ke" \
  -H "Content-Type: application/json" \
  -d '{"score":1337,"playerName":"Sean Plott","cheatMode":false}' \
  https://api.parse.com/1/classes/GameScore

D/ch.boye.httpclientandroidlib.wire(18636): >> "POST /1/files/audio HTTP/1.1[\r][\n]"
D/ch.boye.httpclientandroidlib.wire(18636): >> "X-Parse-Application-Id: LAbR[\r][\n]"
D/ch.boye.httpclientandroidlib.wire(18636): >> "X-Parse-REST-API-Key: kuI9[\r][\n]"
D/ch.boye.httpclientandroidlib.wire(18636): >> "Content-Type: audio/*[\r][\n]"
D/ch.boye.httpclientandroidlib.wire(18636): >> "Content-Length: 12074[\r][\n]"
D/ch.boye.httpclientandroidlib.wire(18636): >> "Host: api.parse.com[\r][\n]"
D/ch.boye.httpclientandroidlib.wire(18636): >> "Connection: Keep-Alive[\r][\n]"
D/ch.boye.httpclientandroidlib.wire(18636): >> "[\r][\n]"
D/ch.boye.httpclientandroidlib.wire(18636): >> "--"
D/ch.boye.httpclientandroidlib.wire(18636): >> "cVxX6b-jxQnxFCczaKHLNZ_Hq8HI9AEW219GW3w"
D/ch.boye.httpclientandroidlib.wire(18636): >> "[\r][\n]"
D/ch.boye.httpclientandroidlib.wire(18636): >> "Content-Disposition"
D/ch.boye.httpclientandroidlib.wire(18636): >> ": "
D/ch.boye.httpclientandroidlib.wire(18636): >> "form-data; name="bin"; filename="myfile.3gp""
D/ch.boye.httpclientandroidlib.wire(18636): >> "[\r][\n]"
D/ch.boye.httpclientandroidlib.wire(18636): >> "Content-Type"
D/ch.boye.httpclientandroidlib.wire(18636): >> ": "
D/ch.boye.httpclientandroidlib.wire(18636): >> "application/octet-stream"
D/ch.boye.httpclientandroidlib.wire(18636): >> "[\r][\n]"
D/ch.boye.httpclientandroidlib.wire(18636): >> "[\r][\n]"

D/ch.boye.httpclientandroidlib.headers(18636): >> POST /1/files/audio HTTP/1.1
D/ch.boye.httpclientandroidlib.headers(18636): >> X-Parse-Application-Id: LAbR
D/ch.boye.httpclientandroidlib.headers(18636): >> X-Parse-REST-API-Key: kuI9
D/ch.boye.httpclientandroidlib.headers(18636): >> Content-Type: audio/*
D/ch.boye.httpclientandroidlib.headers(18636): >> Content-Length: 12074
D/ch.boye.httpclientandroidlib.headers(18636): >> Host: api.parse.com
D/ch.boye.httpclientandroidlib.headers(18636): >> Connection: Keep-Alive

Когда вы привыкнете включать / выключать журналы Android, все, что вы делаете в Curl для тестов подключения, вы можете просто реализовать в Android httpclient, и он будет работать до тех пор, пока вы помещаете в основном те же заголовки, mimetype, тело сообщения (JsonAsString) в вашем андроиде.

person Robert Rowntree    schedule 06.07.2014