我在哪里将REST客户端身份验证数据放在查询中?

时间:2011-07-04 12:27:23

标签: java android http rest restful-authentication

我需要在我的客户端创建的android应用程序中使用REST api。下面的文字只是从客户提供给我们的pdf中复制而来。

-
在此示例中,将创建一个新用户。 服务器可能请求的部分如下所示:

消息部分内容

Header POST {url-prefix}/rest/user
Content-Type: application/xml
Content-Length: 205
Body <request>
  <client>
    <id>XY</id>
    <name>myName</name>
    <password>myPassword</password>
  </client>
  <user>
    <name>myUserName</name>
    <password>myUserPassword</password>
    <groupId>12345</groupId>
  </user>
</request>

-
在搜索和学习之后,我开始知道,可能的请求代码(用Java)可能是:

URL url=new URL("http://api.example.com/rest/user/?name=myUserName&password=myUserPassword&groupId=12345");
            HttpURLConnection conn=(HttpURLConnection) url.openConnection();
            conn.setDoOutput(true);
            conn.setRequestMethod("Post");
            OutputStreamWriter out=new OutputStreamWriter(conn.getOutputStream());
            out.write("respose content:");
            out.close();

从他们提供的pdf手册中,我知道,对于服务器的每个请求,客户端(我都是)必须传输身份验证数据。
我的问题是,我在哪里将身份验证数据放在查询字符串中?请帮帮我。

编辑:将以下代码作为请求发布后:

            DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost("http://api.example.com/rest/user/?name=Foysal&password=123456&groupid=12345");
            httpPost.addHeader("Accept", "text/xml");
            httpPost.setHeader("Content-Type","application/xml;charset=UTF-8");
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("name", "APIappDevAccount"));
            nameValuePairs.add(new BasicNameValuePair("password", "123456"));           
            httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpParams params = new BasicHttpParams();
            HttpConnectionParams.setStaleCheckingEnabled(params, false);
            HttpConnectionParams.setConnectionTimeout(params, 5000);
            HttpConnectionParams.setSoTimeout(params, 5000);
            httpClient.setParams(params);
            httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.RFC_2109);
            HttpResponse response = httpClient.execute(httpPost);
            InputStream is = response.getEntity().getContent();
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            byte[] buf;
            int ByteRead;
            buf = new byte[1024];
            String xmldata = null;
            double totalSize = 0;
            while ((ByteRead = is.read(buf, 0, buf.length)) != -1) {
                os.write(buf, 0, ByteRead);
                totalSize += ByteRead;                      
            }
            xmldata =  os.toString();
            os.close();
            is.close();


但我收到了回复:

  

404   未找到   

未找到

请求的   在此未找到URL / rest / user /   服务器。


Apache / 2.2.6   (Fedora)DAV / 2 mod_ssl / 2.2.6   OpenSSL / 0.9.8b服务器在   api.example.com端口80   

2 个答案:

答案 0 :(得分:0)

在我看来,他们希望您发布一个XML文档并将身份验证放入其中。没有太多的REST API(大多数REST APIS不需要XML文档)。

您需要使用conn.getOutputStream()将该doc发送到服务器并使用conn.getInputStream()来读取响应。

所以你必须像他们展示的那样创建XML文档:

<request>
  <client>
    <id>XY</id>
    <name>myName</name>
    <password>myPassword</password>
  </client>
  <user>
    <name>myUserName</name>
    <password>myUserPassword</password>
    <groupId>12345</groupId>
  </user>
</request>

然后在你的POST中发送它:

conn.setRequestProperty ( "Content-Type", "text/xml" );
out.write(requestDoc); //where requestDoc is the String containing the XML.
out.flush();
out.close();

答案 1 :(得分:0)

您可以执行如下所示的POST请求:http://www.androidsnippets.com/executing-a-http-post-request-with-httpclient并将身份验证数据作为名称值对进行处理:

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("name", "myUserName"));
    nameValuePairs.add(new BasicNameValuePair("password", "myUserPassword"));
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

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

} catch (Exception e) {
    // ... handle exception here
}