Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Android中使用REST Web服务_Java_Android_Rest_Parameters_Httpurlconnection - Fatal编程技术网

Java 在Android中使用REST Web服务

Java 在Android中使用REST Web服务,java,android,rest,parameters,httpurlconnection,Java,Android,Rest,Parameters,Httpurlconnection,我正在尝试在Android中使用一些RESTful Web服务。我使用Jersey来提供Web服务,我在Android客户端使用HttpURLConnection,我的问题是:参数没有传输到服务器 以下是我的服务器端代码: @Path("/user") @RequestScoped public class UserService implements Serializable { @PersistenceContext private EntityManager em;

我正在尝试在Android中使用一些RESTful Web服务。我使用Jersey来提供Web服务,我在Android客户端使用HttpURLConnection,我的问题是:参数没有传输到服务器

以下是我的服务器端代码:

@Path("/user")
@RequestScoped
public class UserService implements Serializable {

    @PersistenceContext
    private EntityManager em;

    public UserService() {

    }

    @POST
    @Path("/register")
    @Produces(MediaType.APPLICATION_JSON)
    @Transactional(TxType.REQUIRED)
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public Integer registerUser(@QueryParam("username") String username, @QueryParam("password") String password, 
        @QueryParam("registrationToken") String registrationToken) {
        User user = new User(username, password, registrationToken);
        em.persist(user);
        System.out.println("registerUser erfolgreich aufgerufen. Userid: " + user.getId());
        return user.getId();
    }

}
对于Android客户端,我创建了NetClient类及其注册方法:

public int register (String username, String password, String registrationToken) throws MalformedURLException, IOException {
    URL url = new URL(SERVER_URI + "/user/register");
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod("POST");
    connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    connection.setDoOutput(true);
    connection.setDoInput(true);
    Uri.Builder builder = new Uri.Builder()
            .appendQueryParameter("username", username)
            .appendQueryParameter("password", password)
            .appendQueryParameter("registrationToken", registrationToken);
    String query = builder.build().getEncodedQuery();

    OutputStream os = connection.getOutputStream();
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
    writer.write(query);
    writer.flush();
    writer.close();
    os.close();

    BufferedReader br = new BufferedReader(new  InputStreamReader(connection.getInputStream()));
    String response = br.readLine();
    br.close();
    Integer id = new Gson().fromJson(response, Integer.class);
    return id.intValue();
}
因此,registerUser确实会被调用,但是如果我在registerUser方法服务器端打印参数username或password,我可以看到它们为null。 有人来告诉我我做错了什么吗?
提前感谢,感谢您的建议

在发送查询参数时,不需要设置doOutput(true)。试着摆脱它,它可能会有所帮助。感谢您的输入:)那么,客户端和服务器根本不适合?问题是,我想稍后发布更复杂的用户,还有一张图片,这就是为什么我想让客户端使用outputstream。所以,我必须将inputparams更改为inputstream?据我所知,您不需要将doOutput设置为true,除非您希望在请求体中传递某些内容。查询参数不是正文的一部分,因此存在问题。当您发送图像时,我相信您需要在请求体中写入该数据。当您发送查询参数时,您不需要设置输出(true)。试着摆脱它,它可能会有所帮助。感谢您的输入:)那么,客户端和服务器根本不适合?问题是,我想稍后发布更复杂的用户,还有一张图片,这就是为什么我想让客户端使用outputstream。所以,我必须将inputparams更改为inputstream?据我所知,您不需要将doOutput设置为true,除非您希望在请求体中传递某些内容。查询参数不是正文的一部分,因此存在问题。当您发送图像时,您需要在请求体中写入数据,我相信。