当前位置: 首页 > 面试题库 >

使用Java for Android的HTTP API请求

柳珂
2023-03-14
问题内容

我找到了我想免费玩的API。我想问一下是否要使用API​​开发Android应用,并且该API基于HTTP协议(RESTful),如何使用
HTTPClient 对象来实现?

我有一般要求的信息。

HEAD /authenticate/ HTTP/1.1
Host: my.api.com
Date: Thu, 17 Jul 2008 14:52:54 GMT
X-SE-Client: some-value
X-SE-Accept: xml
X-SE-Auth: 90a6d325e982f764f86a7e248edf6a660d4ee833

以上的回应将是成功的话。

HTTP/1.1 200 OK
Date: Thu, 17 Jul 2008 14:52:55 GMT
Server: MyApi
Content-Length: 795
Connection: close
Content-Type: text/xml

我知道如何使用HTTPClient发送HTTP请求,但是否向请求中添加了额外的标头和其他不必要的内容?如何查看HTTPClient对象发出的请求?我只想简单地请求像
telnet 一样传递文本。


问题答案:

您应该能够在Android中使用HttpClient来完成所需的工作。我刚刚完成了将Android与ASP.NET MVC 3站点集成的第一部分,我必须说-
这非常轻松。我使用Json作为数据交换格式。

您可以在建立请求后通过设置调试点来准确查看标头的外观。这是一些示例代码(请记住,这只是示例代码-并非完整的实现)。

此类由不同于UI线程的单独线程调用:

public class RemoteDBAdapter {


    public String register(String email, String password) throws Exception
    {
        RestClient c = new RestClient("http://myurl/Account/Register");
        c.AddHeader("Accept", "application/html" target="_blank">json");
        c.AddHeader("Content-type", "application/json");
        c.AddParam("Email", email);
        c.AddParam("Password", password);

        c.Execute(RequestMethod.POST);

        JSONObject key = new JSONObject(c.getResponse());

        return key.getString("status");


    }

}

使用此类来构建您的请求并执行它:

public class RestClient {

    public enum RequestMethod {
        GET,
        POST
    }

    private ArrayList <NameValuePair> params;
    private ArrayList <NameValuePair> headers;

    private String url;

    private int responseCode;
    private String message;

    private String response;

    public String getResponse() {
        return response;
    }

    public String getErrorMessage() {
        return message;
    }

    public int getResponseCode() {
        return responseCode;
    }

    public RestClient(String url)
    {
        this.url = url;
        params = new ArrayList<NameValuePair>();
        headers = new ArrayList<NameValuePair>();
    }

    public void AddParam(String name, String value)
    {
        params.add(new BasicNameValuePair(name, value));
    }

    public void AddHeader(String name, String value)
    {
        headers.add(new BasicNameValuePair(name, value));
    }

    public void Execute(RequestMethod method) throws Exception
    {
        switch(method) {
            case GET:
            {
                //add parameters
                String combinedParams = "";
                if(!params.isEmpty()){
                    combinedParams += "?";
                    for(NameValuePair p : params)
                    {
                        String paramString = p.getName() + "=" + URLEncoder.encode(p.getValue(),"UTF-8");
                        if(combinedParams.length() > 1)
                        {
                            combinedParams  +=  "&" + paramString;
                        }
                        else
                        {
                            combinedParams += paramString;
                        }
                    }
                }

                HttpGet request = new HttpGet(url + combinedParams);

                //add headers
                for(NameValuePair h : headers)
                {
                    request.addHeader(h.getName(), h.getValue());
                }

                executeRequest(request, url);
                break;
            }
            case POST:
            {
                HttpPost request = new HttpPost(url);

                //add headers
                for(NameValuePair h : headers)
                {
                    request.addHeader(h.getName(), h.getValue());
                }
                JSONObject jo = new JSONObject();


                if(!params.isEmpty()){
                    for (int i = 0; i < params.size();i++)
                    {
                        jo.put(params.get(i).getName(),params.get(i).getValue());


                    }
                    StringEntity se = new StringEntity(jo.toString());
                    se.setContentType("text/xml"); 
                    se.setContentEncoding( new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));

                    request.setEntity(se);
                    //request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
                }

                executeRequest(request, url);
                break;
            }
        }
    }

    private void executeRequest(HttpUriRequest request, String url)
    {
        //HttpClient client = new DefaultHttpClient();
        HttpClient client = HttpClientFactory.getThreadSafeClient();

        HttpResponse httpResponse;

        try {
            httpResponse = client.execute(request);
            responseCode = httpResponse.getStatusLine().getStatusCode();
            message = httpResponse.getStatusLine().getReasonPhrase();

            HttpEntity entity = httpResponse.getEntity();

            if (entity != null) {

                InputStream instream = entity.getContent();
                response = convertStreamToString(instream);

                // Closing the input stream will trigger connection release
                instream.close();
            }

        } catch (ClientProtocolException e)  {
            client.getConnectionManager().shutdown();
            e.printStackTrace();
        } catch (IOException e) {
            client.getConnectionManager().shutdown();
            e.printStackTrace();
        }
    }

    private static String convertStreamToString(InputStream is) {

        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();

        String line = null;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }
}

编辑:

哦,还有HttpClientFactory:

// Should be thread safe
public class HttpClientFactory {

            private static DefaultHttpClient client;

            public synchronized static DefaultHttpClient getThreadSafeClient() {
                    if (client != null)
                            return client;
                    client = new DefaultHttpClient();
                    ClientConnectionManager mgr = client.getConnectionManager();
                    HttpParams params = client.getParams();
                    client = new DefaultHttpClient(new ThreadSafeClientConnManager(params,
                                    mgr.getSchemeRegistry()), params);
                return client;

            }
    }


 类似资料:
  • 嗨,有人能帮我吗。 如何请求soapweb服务并获取xml响应。Senario:使用SOAPUIIM发送带有用户名、密码身份验证的wsdl url,我还将发送SOAPXML数据并获得响应。如何使用nodejs或sails实现同样的目标。 在SoapUi中,我的soapxml请求如下 我的Soap身份验证就像 $UserName:xyz 我的wsdl url是http://esbuatt1wm.it

  • 问题内容: 我正在尝试通过javascript发布到我的 跨域 * 休息服务 *,并且意识到除非我使用此规范,否则这是不可能的; http://www.w3.org/wiki/CORS_Enabled 但是,关于如何实现此功能的文档非常有限,我有几个问题; 1-我使用 Glassfish Jee6 应用服务器,所以我可以简单地在我的web.xml中添加一个 码头 过滤器并完成工作吗? 2-并且对于

  • 我试图使用HttpURLConnection执行post请求,但不知道如何正确执行。 我可以使用以下代码成功地使用Android AsyncHttp客户端执行请求: 可以在台式机上使用curl执行相同的请求: 这两种方法都给了我来自服务器的预期响应。 现在我想使用HttpURLConntions执行相同的请求。问题是我不知道如何正确地执行它。我尝试过这样的事情: 如何正确地将与使用AsyncHtt

  • 问题内容: 我正在使用djang-tastypie作为后端和AngularJs作为前端的API。我正在使用angularjs $ http从CRUD发送请求。GET,POST,PUT一切都很好,但是当我尝试发送PATCH请求时,出现错误,未定义PATCH方法。我已经在angular中创建了一个api调用工厂,但是PATCH请求在那里不起作用。 这是我的HTML代码 当我在控制台中使用此代码发送路径

  • 问题内容: 我试图弄清楚如何使用node.js发出HTTP PUT请求。我尝试了很多不同的方法,但是无法正常工作。 这个想法是要有一种放置文件的方法,例如: 任何帮助,将不胜感激。 问题答案: 以下是发送请求的示例:http : //nodejs.org/docs/v0.4.11/api/http.html#http.request,基本上,您只需将其更改为即可。 您可以使用createReadS

  • 我如何在这个Json文件中保存对象数据..请帮助我。

  • 通过HttpUrlConnection在服务器上注册用户数据的Post请求 在android中通过http post方法发送json对象 如何用Android通过请求发送JSON对象?

  • 我想显示数据从API使用angularJS。当在同一台电脑上运行代码时,这段代码工作正常。但是当我试图在另一台电脑上测试时,它显示错误,请求的资源上没有访问控制允许来源的标头。angularjs 我使用的是1.4.8 这是我的密码: