如何从Android应用程序发送json数据并在运行在泽西岛的其他Web服务中接收它?

时间:2016-07-27 06:24:16

标签: java android json rest jersey

我已经将我的其余网络服务代码设置为像这样启动服务器:

static final String BASE_URI = "http://10.236.51.14:9000/abcd/";

public static void main(String[] args) {
    try {
        HttpServer server = HttpServerFactory.create(BASE_URI);
        server.start();
        System.out.println("Press Enter to stop the server. ");
        System.in.read();
        server.stop(0);
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

在其余的Web服务中,我已经制作了一个基本代码来接收2个参数并显示它们的总和:

@GET
@Path("/add/{a}/{b}")
@Produces(MediaType.TEXT_XML)
public String add(@PathParam("a") double a, @PathParam("b") double b) {
    return "<?xml version=\"1.0\"?>" + "<result>" +  (a + b)                 +     "</result>";
}

我想将我的Android应用程序中的Json数据(图像)发送到此Web服务,但我不知道如何在Web服务中接收它并显示它。 这是我的Android应用程序的代码。在这里我使用Base64将位图转换为字符串。我该如何将其发送到我的网络服务?

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    mybitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
    byte[] b = baos.toByteArray();
    String strBitMap = Base64.encodeToString(b, Base64.DEFAULT);

任何帮助将不胜感激:) 我搜索了很多,但无法找到适合我的webservice的代码来接收和显示json数据。我也在努力将这个base64字符串以json的形式发送到web服务。 请帮帮我。 最好的问候:)

1 个答案:

答案 0 :(得分:0)

我有一个问题:您的示例WebService是否有效?我指的是有两个论点的人。如果您在浏览器中拨打http://10.236.51.14:9000/abcd/add/1/2,它是否正确显示3?如果没有,您应该有一个包含REST接口的ApplicationConfig。这些应该作为资源类添加,例如:

@ApplicationPath("api")
public class ApplicationConfig extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> resources = new HashSet<>();
        resources.addAll(addServiceClasses());
        resources.addAll(addFilterClasses());
        return resources;
    }

    private Set<Class<?>> addServiceClasses() {

    // add all your REST-classes here
        Set<Class<?>> resources = new HashSet<>();
        resources.add(YourCalculatorRestServiceClass.class);
        resources.add(YourImageConsumingRestServiceClass.class);

        return resources;
    }

    private Set<Class<?>> addFilterClasses() {

    // add all your filter classes here (if you have any)
        Set<Class<?>> resources = new HashSet<>();

        resources.add(YourAuthenticationFilterClass.class);
        resources.add(OtherFilterClass.class);

        return resources;
    }

    @Override
    public Map<String, Object> getProperties() {
        Map<String, Object> properties = new HashMap<>();

        // in Jersey WADL generation is enabled by default, but we don't 
        // want to expose too much information about our apis.
        // therefore we want to disable wadl (http://localhost:8080/service/application.wadl should return http 404)
        // see https://jersey.java.net/nonav/documentation/latest/user-guide.html#d0e9020 for details
        properties.put("jersey.config.server.wadl.disableWadl", true);

        // we could also use something like this instead of adding each of our resources
        // explicitly in getClasses():
        // properties.put("jersey.config.server.provider.packages", "com.nabisoft.tutorials.mavenstruts.service");
        return properties;
    }
}

这应该成交,你应该可以致电http://10.236.51.14:9000/abcd/api/add/1/2。 ApplicationConfig使用@Path("api")进行注释。这意味着在此配置中注册的所有类都具有根路径http://your.server.address/api/

现在你的问题。我假设您的服务器正常运行,您可以通过浏览器访问显示结果3的Webservice /add/1/2

现在您需要另一项服务来监听POST。我已将您已准备好的String作为发布的内容。

@Path("image")
public class ImageReceiverRestService {

    @POST
    public Response checkAssignable(String base64ImageString) {
        // code here working with the base64ImageString

        // response code according to whatever happened during your algorithm
        return Response.ok().build();
    }
}

有关适当的HTTP响应代码,请参阅此Wikipedia文章,以获得快速概述HTTP Status Codes

所以现在你需要在你的Android应用程序上使用相应的客户端。例如:

public class ImageSendingRestClient {

    private final static String SERVER_BASE_URI = "http://10.236.51.14:9000/abcd/api/";
    private final static String API_ADDRESS = "image/";

    public ImageSendingRestClient() {
    }

    @Override
    public void sendImageStringForProcessing(String base64ImageString) throws Exception {
        Entity<String> entity = Entity.json(base64ImageString);

        Response response = ClientBuilder.newClient()
                .target(SERVER_BASE_URI)
                .path(API_ADDRESS)
                .request()
                .post(entity);

        try {
            if (response.getStatus() == Response.Status.OK.getStatusCode()) {
                return;
            }
            if (response.getStatus() == Response.Status.NOT_FOUND.getStatusCode()) {
                throw new Exception;
            }
        } finally {
            response.close();
        }
    }
}

所需的所有依赖项都是JAX-RS实现,如JAX-RS reference implementation Jersey。也许您还应该查看泽西岛指南中的许多示例,提供您需要的大部分信息Jersey User Guide