web-dev-qa-db-ja.com

Android、Java:HTTP POSTリクエスト

ユーザー名とパスワードを使用してユーザーを認証するために、WebサービスにHTTPポストリクエストを行う必要があります。 Webサービス担当者は、HTTP Post要求を作成するために次の情報を提供してくれました。

POST /login/dologin HTTP/1.1
Host: webservice.companyname.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 48

id=username&num=password&remember=on&output=xml

私が取得するXMLレスポンスは

<?xml version="1.0" encoding="ISO-8859-1"?>
<login>
 <message><![CDATA[]]></message>
 <status><![CDATA[true]]></status>
 <Rlo><![CDATA[Username]]></Rlo>
 <Rsc><![CDATA[9L99PK1KGKSkfMbcsxvkF0S0UoldJ0SU]]></Rsc>
 <Rm><![CDATA[b59031b85bb127661105765722cd3531==AO1YjN5QDM5ITM]]></Rm>
 <Rl><![CDATA[[email protected]]]></Rl>
 <uid><![CDATA[3539145]]></uid>
 <Rmu><![CDATA[f8e8917f7964d4cc7c4c4226f060e3ea]]></Rmu>
</login>

これは私がやっていることですHttpPost postRequest = new HttpPost(urlString);残りのパラメーターを作成するにはどうすればよいですか?

43
Faheem Kalsekar

これは以前に androidsnippets.com で見つかった例です(このサイトは現在維持されていません)。

// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://www.yoursite.com/script.php");

try {
    // Add your data
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
    nameValuePairs.add(new BasicNameValuePair("id", "12345"));
    nameValuePairs.add(new BasicNameValuePair("stringdata", "AndDev is Cool!"));
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

    // Execute HTTP Post Request
    HttpResponse response = httpclient.execute(httppost);

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

したがって、パラメータを BasicNameValuePair として追加できます。

別の方法として、(Http)URLConnectionJava要求を起動および処理するためのJava.net.URLConnectionの使用 も参照してください。これは実際には新しいAndroidバージョン(Gingerbread +)で推奨される方法です。参照 this blogこの開発者ドキュメント およびAndroidの HttpURLConnection javadoc

84
BalusC

@BalusCの答えに、文字列の応答を変換する方法を追加します。

HttpResponse response = client.execute(request);
HttpEntity entity = response.getEntity();
if (entity != null) {
    InputStream instream = entity.getContent();

    String result = RestClient.convertStreamToString(instream);
    Log.i("Read from server", result);
}

convertStramToStringの例

6
Fabricio PH

HttpPostの使用を検討してください。これから採用: http://www.javaworld.com/javatips/jw-javatip34.html

URLConnection connection = new URL("http://webservice.companyname.com/login/dologin").openConnection();
// Http Method becomes POST
connection.setDoOutput(true);

// Encode according to application/x-www-form-urlencoded specification
String content =
    "id=" + URLEncoder.encode ("username") +
    "&num=" + URLEncoder.encode ("password") +
    "&remember=" + URLEncoder.encode ("on") +
    "&output=" + URLEncoder.encode ("xml");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 

// Try this should be the length of you content.
// it is not neccessary equal to 48. 
// content.getBytes().length is not neccessarily equal to content.length() if the String contains non ASCII characters.
connection.setRequestProperty("Content-Length", content.getBytes().length); 

// Write body
OutputStream output = connection.getOutputStream(); 
output.write(content.getBytes());
output.close();

例外を自分でキャッチする必要があります。

3
gigadot

Volleyを使用してGET、PUT、POST ...リクエストを行うことをお勧めします。

まず、gradleファイルに依存関係を追加します。

compile 'com.he5ed.lib:volley:Android-cts-5.1_r4'

次に、このコードスニペットを使用してリクエストを作成します。

RequestQueue queue = Volley.newRequestQueue(getApplicationContext());

        StringRequest postRequest = new StringRequest( com.Android.volley.Request.Method.POST, mURL,
                new Response.Listener<String>()
                {
                    @Override
                    public void onResponse(String response) {
                        // response
                        Log.d("Response", response);
                    }
                },
                new Response.ErrorListener()
                {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        // error
                        Log.d("Error.Response", error.toString());
                    }
                }
        ) {
            @Override
            protected Map<String, String> getParams()
            {
                Map<String, String>  params = new HashMap<String, String>();
                //add your parameters here as key-value pairs
                params.put("username", username);
                params.put("password", password);

                return params;
            }
        };
        queue.add(postRequest);
2
Bugs Buggy

ACRAに追加した実装を再利用できます。 http://code.google.com/p/acra/source/browse/tags/REL-3_1_0/CrashReport/src/org/acra/HttpUtils.java? r = 236

(自己署名証明書でもhttpおよびhttpsを操作するdoPost(Map、Url)メソッドを参照してください)

0
Kevin Gaudin

JavaのHttpClientを試してください。

http://hc.Apache.org/httpclient-3.x/

0
TheCoolah

次のコードを使用して、HTTP POST from from Androidクライアントアプリをサーバー上のC#デスクトップアプリに送信します。

// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://www.yoursite.com/script.php");

try {
    // Add your data
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
    nameValuePairs.add(new BasicNameValuePair("id", "12345"));
    nameValuePairs.add(new BasicNameValuePair("stringdata", "AndDev is Cool!"));
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

    // Execute HTTP Post Request
    HttpResponse response = httpclient.execute(httppost);

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

私は、サーバー上のC#アプリ(Webサーバーの小さなアプリケーションのようなもの)からの要求を読み取ることに取り組みました。次のコードを使用して、リクエストの投稿データを読み取ることができました。

server = new HttpListener();
server.Prefixes.Add("http://*:50000/");
server.Start();

HttpListenerContext context = server.GetContext();
HttpListenerContext context = obj as HttpListenerContext;
HttpListenerRequest request = context.Request;

StreamReader sr = new StreamReader(request.InputStream);
string str = sr.ReadToEnd();
0
ossamacpp