【问题标题】:How to send a String using jersey and HttpURLConnection如何使用球衣和 HttpURLConnection 发送字符串
【发布时间】:2015-12-22 13:08:45
【问题描述】:

我正在尝试将一串文本作为 response 的一部分从 Jersey 网络服务发送到 Android 应用程序。

这是 web 服务接收请求并返回响应的方式:

控制器

import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
     @Path("/retrieve/some/text")
       @POST @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
       @Produces(MediaType.APPLICATION_JSON)
       public Response retrieveSomeText(@FormParam("email") String email){

            User user = new User();
            user.setEmail(email);
            return new UserService(user).retrieveSomeText();

       }

服务

import javax.ws.rs.core.Response;
    public Response retrieveSomeText() {
        Response response = Response.status(200).entity("some text to send").build();

        return response;
    }

Android 应用使用 `HttpURLConnection: 发送请求:

public String retrieveSomeText(String email, String method){
        String securityQuestion = "";
        try {
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setReadTimeout(10000);
            con.setConnectTimeout(15000);
            con.setRequestMethod(method);
            con.setDoInput(true);
            con.setDoOutput(true);

            List<NameValuePair> params = new ArrayList<>();
            params.add(new BasicNameValuePair("email", email));
            OutputStream os = con.getOutputStream();
            BufferedWriter writer = new BufferedWriter(
                    new OutputStreamWriter(os, "UTF-8"));
            writer.write(getQuery(params));
            writer.flush();
            writer.close();
            os.close();

            con.connect();
            securityQuestion = con.getResponseMessage();

        } catch (IOException e) {
            e.printStackTrace();
        }
        return securityQuestion;
    }

响应消息是“已创建”。如何获取作为 Web 服务响应的一部分发送的文本字符串?

【问题讨论】:

  • 阅读 getResponseMessage() 的 javadoc。这不是你想的那样。你要的是输入流,那你需要自己提取数据,InputStream in = con.getInputStream()
  • 谢谢,欢迎回答。

标签: java android web-services jersey httpurlconnection


【解决方案1】:

我对您的建议是尝试使用 jersey rest 客户端,您可以轻松获得响应。

docs

请参考以下代码,

try {
    Client client = Client.create();
    WebResource webResource = client
       .resource("http://localhost:8080/your_app_name/retrieve/some/text");
    ClientResponse response = webResource.accept("application/json")
               .post(ClientResponse.class);
    String output = response.getEntity(String.class);
    System.out.println(output);

  } catch (Exception e) {

    e.printStackTrace();

  }

【讨论】:

    【解决方案2】:

    你可以在android中做这样的事情

        final StringBuilder resp = connect(serverUrl.toString(), null, true);
    
        try {
            final JSONObject json = new JSONObject(resp.toString());
    // if an array is retreived, use final JSONArray jsonArr = new JSONArray(resp.toString());
        } catch (JSONException e) {
            throw new LectopolisExcepcion(e);
        }
    

    连接在哪里

    /**
         * Ejecuta un sertvico contra el servidor
         *
         * @param serverUrl
         *            URL de acceso
         * @param datos
         *            Datos en formato JSON. Si viene informado hacemos un POST, en otro caso un GET
         * @return Respuesta
         */
        private StringBuilder connect(String serverUrl,
                                       Object datos,
                                       boolean esSeguro) throws MyExcepcion {
    
    
            try {
                final long ini = System.currentTimeMillis();
    
                final HttpResponse response = ejecutaServicio(serverUrl, datos, esSeguro);
    
                final StatusLine statusLine = response.getStatusLine();
                final int statusCode = statusLine.getStatusCode();
    
                StringBuilder builder = new StringBuilder();
    
                if (statusCode == 200) {
                    builder = decodeRespuesta(response);
                } else {
                    Log.e(this.getClass().getName(), "Failed to download file. StatusCode: " + statusCode);
                }
    
                final long fin = System.currentTimeMillis();
                LLog.i("Tiempo proceso: " + (fin - ini));
    
                return builder;
    
            } catch (IOException e) {
                LLog.e("Error en la ejecucion del servicio", e);
                throw new MyExcepcion(e);
            }
        }
    

    并使用

    private HttpResponse ejecutaServicio(String serverUrl,
                                             Object datos,
                                             boolean esSeguro)  throws MyExcepcion, CambioTerminalExcepcion {
    
            StringBuilder builder = new StringBuilder();
    
            final HttpParams httpParams = new BasicHttpParams();
            HttpConnectionParams.setConnectionTimeout(httpParams, TIMEOUT_MILIS);
            HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_DATOS_MILIS);
            final HttpClient client = new DefaultHttpClient(httpParams);
    
            HttpUriRequest request;
    
            try {
                if (datos != null) {
                    request = new HttpPost(Constantes.HOST + serverUrl.replaceAll(" ", "%20"));
    
                    final StringEntity s = new StringEntity(datos.toString(), HTTP.UTF_8);
    
                    s.setContentEncoding("UTF-8");
                    s.setContentType("application/json");
    
                    ((HttpPost) request).setEntity(s);
                    request.addHeader("accept", "application/json");
    
                } else {
                    request = new HttpGet(Constantes.HOST + serverUrl.replaceAll(" ", "%20"));
                }
    
                if (esSeguro) {
                    request.addHeader("Authorization", getAuthHeader());
                }
    
                Log.d(Constantes.TAG, "Invocando URL: " + Constantes.HOST + serverUrl.replaceAll(" ", "%20"));
    
                // Indicamos que aceptamos gzip en la respuesta, para poder
                // traer los datos comprimidos
                request.addHeader("Accept-Encoding", "gzip,deflate");
                final HttpResponse response = client.execute(request);
    
                return response;
            } catch (IOException | NoSuchAlgorithmException e) {
                Log.d(Constantes.TAG, e.getMessage(), e);
                throw new MyExcepcion(e);
            }
        }
    
        /**
         * Interpreta la respuesta del servidor
         *
         * @param response
         *            Respuesta
         * @return StringBuilder con el contenido de la respuesta
         * @throws IllegalStateException
         *             Illegal state
         * @throws IOException
         *             io exception
         */
        private StringBuilder decodeRespuesta(HttpResponse response) throws IOException {
    
            final StringBuilder builder = new StringBuilder();
    
            final HttpEntity entity = response.getEntity();
            InputStream content = entity.getContent();
            BufferedReader reader = null;
    
            Header contentEncoding = response.getFirstHeader("Content-Encoding");
    
            // Si la respuesta esta comprimida, la tratamos adecuadamente
            if (contentEncoding != null && "gzip".equalsIgnoreCase(contentEncoding.getValue())) {
                Log.i("L", "Respuesta comprimida");
                content = new GZIPInputStream(content);
                byte[] tByte = new byte[1024];
    
                while (true) {
                    int iLength = content.read(tByte, 0, 1024);
    
                    if (iLength < 0) {
                        break;
                    }
                    builder.append(new String(tByte, 0, iLength, HTTP.UTF_8));
                }
            } else {
                Log.i("L", "Respuesta no comprimida");
                reader = new BufferedReader(new InputStreamReader(content, HTTP.UTF_8));
                String line;
                while ((line = reader.readLine()) != null) {
                    builder.append(line);
                }
            }
    
            if (reader != null) {
                reader.close();
            }
    
            content.close();
    
            return builder;
        }
    

    这是 json 响应的一般方法。我使用基本身份验证,您可以忽略它。我也接受 gzip 响应。

    对于西班牙语中的一些代码感到抱歉。

    【讨论】:

    • 根据this,正在删除对 Apache HttpClient 的支持。如果 OP 正在编写一个新的应用程序,最好避免使用它。
    • 是的,你完全正确,现在我知道我也必须更新我的应用程序:D,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 2013-10-15
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    相关资源
    最近更新 更多