如何将GET参数传递给Retrofit请求

3

我正在使用SoundCloud API创建一个应用程序,并尝试附加用户输入的字符串值,但在界面上显示为null,该如何将其附加到URL中?

MainActivity.java

  b.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View p1)
            {
                // TODO: Implement this method
                search = et.getText().toString();
                Log.d("search",search);
                Intent i = new Intent(MainActivity.this, SoundCloud.class);
                i.putExtra("mysearch", search);
                startActivity(i);

                Log.d("CustomUrl",SCService.CustomUrl);
                Toast.makeText(MainActivity.this,""+SCService.CustomUrl,Toast.LENGTH_SHORT).show();


                Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(Config.API_URL)
                    .addConverterFactory(GsonConverterFactory.create()).build();

                SCService Scservice = retrofit.create(SCService.class);
                Call<Track> call = Scservice.getTrack(search);
                call.enqueue(new Callback<Track>(){

                        @Override
                        public void onResponse(Call<Track> call, Response<Track> response)
                        {
                            // TODO: Implement this method
                            if (response.isSuccessful())
                            {
                                Track track = response.body();
                                streamUrl = track.getStreamUrl();
                                trackname = track.getTitle();
                                Log.e("track", track.getTitle());
                                Toast.makeText(MainActivity.this, trackname, Toast.LENGTH_SHORT).show();
                                Toast.makeText(MainActivity.this, "url" + streamUrl, Toast.LENGTH_SHORT).show();
                                //addToList(trackname);
                            }
                        }

                        @Override
                        public void onFailure(Call<Track> p1, Throwable p2)
                        {
                            // TODO: Implement this method
                            Toast.makeText(MainActivity.this,"error"+p2.getMessage(),Toast.LENGTH_SHORT).show();
                            //showMessage("Network Error: " +  p2.getMessage());
                            Log.d("error", p2.getMessage());
                        }
                    });

            }
        });

ScService.java

public interface SCService
{
    public String CustomUrl = Config.API_URL+"/resolve.json?url="+SoundCloud.SCURL+"&client_id="+Config.CLIENT_ID;
@GET("/resolve.json?url={SCURL}"+"&client_id="+Config.CLIENT_ID)
Call<Track> getTrack(@Path("SCURL")String SCURL);
}       

搜索的字符串在我的SoundCloud.java类中。

    SCURL = receivedmsg.getString("mysearch");
    Log.d("intentdata",SCURL);

    tv.setText("Search Results for " + SCURL);  

我希望将SCURL字符串附加到GET参数中,但它显示SCURL的值为空,我该如何实现?
更新:我已经按照上面的代码进行了更改,但是出现了这个错误。
enter code here
  03-15 13:22:14.866 6149 6149 D     search com.sk.scdoenloader                   /https://m.soundcloud.com/dharmaworldwide/houseofcards-mixmaster-05b
  03-15 13:22:14.967 6149 6149 D     CustomUrl com.sk.scdoenloader                https://api.soundcloud.com/resolve.json?url=null&client_id=iZIs9mchVcX5lhVRyQGGAYlNPVldzAoX
  03-15 13:22:15.299 6149 6149 E     AndroidRuntime com.sk.scdoenloader                   FATAL EXCEPTION: main
  03-15 13:22:15.299 6149 6149 E     AndroidRuntime com.sk.scdoenloader           Process: com.sk.scdoenloader, PID: 6149
  03-15 13:22:15.299 6149 6149 E     AndroidRuntime com.sk.scdoenloader           java.lang.IllegalArgumentException: No Retrofit annotation found. (parameter #1)
  03-15 13:22:15.299 6149 6149 E     AndroidRuntime com.sk.scdoenloader           for method SCService.getTrack
  03-15 13:22:15.299 6149 6149 E     AndroidRuntime com.sk.scdoenloader           at retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:720)
  03-15 13:22:15.299 6149 6149 E     AndroidRuntime com.sk.scdoenloader           at retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:711)
  03-15 13:22:15.299 6149 6149 E     AndroidRuntime com.sk.scdoenloader           at retrofit2.ServiceMethod$Builder.parameterError(ServiceMethod.java:729)
  03-15 13:22:15.299 6149 6149 E     AndroidRuntime com.sk.scdoenloader                     

可能是您在变量获得值之前使用了它。 - Tejas Pandya
你可以使用如下代码:@GET("/resolve.json?url={SCURL}"),并调用以下方法获取所有评论:Call<CommentMainPojo>getAllComments(@Path("SCURL")String SCURL); - matin sayyad
找不到 Retrofit 注解。(参数 #1)发生了错误。 - shubham kumbhar
receivedmsg 是什么?在 SCURL = receivedmsg.getString("mysearch"); 中。 - Nikunj
这是用于从意图中获取字符串的Bundle对象 receivedmsg = getIntent().getExtras(); - shubham kumbhar
4个回答

12

你需要在这里使用 @Path

@GET("/resolve.json?url={url}&client_id={clientId}")
Call<Track> getTrack(@Path("url") String url,@Path("clientId") String clientId);

1
这个方案比另一个使用简单字符串连接的答案更好。 - Rohit5k2
出现了这个错误:未找到Retrofit注释(参数#1),我已经更新了问题,我犯了什么错误? - shubham kumbhar
确保下面的内容放在正确的Retrofit包中。在我的情况下,我错误地从retrofit导入了一个注释,而不是从retrofit2中导入。 - Ramkumar.M
我正在使用AIDE应用程序,它在项目目录中包含一个名为Proguard-Rules.pro的progurd文件。 - shubham kumbhar
我已经添加了Proguard规则,但问题仍未解决 :( - shubham kumbhar
显示剩余3条评论

6

你可以使用Retrofit的动态URL!! (使用@Get

public interface SCService{  
   @GET
   public Call<Track> getTrack(@Url String url);
}

然后,您可以使用您的自定义字符串URL进行调用。
 service.getTrack("/resolve.json?url="+SoundCloud.SCURL+"&client_id="+ Config.CLIENT_ID + SCURL)

1
你需要的是GET参数,而不是路径,因此请使用@Query("scurl") String scurl
更多细节在这里
顺便说一句,在Java中使用全大写字母作为变量名有点奇怪,这里使用scurlSCURL更合适。

我现在使用了Asynctask,我的项目已经完成了,但还是感谢您的回答,下次我会尝试这个。我将SCURL设置为静态变量并将其大写。 - shubham kumbhar
我理解 SCURL 是 SoundCloud 类的静态常量。但是,在 Call<Track> getTrack(@Path("SCURL")String SCURL); 方法的上下文中,它是一个普通变量,不应该使用全大写。 - ericn

1

你必须在这里使用@Query

 @GET("Account/RegisterMobileNumber")
 Call<JsonObject> sendSMSToMobileNumber(@Query("mobileNumber") String mobileNumber);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接