Javascript 向my API提供关键字时接收空白页
我正在开发一个使用新闻api检索新闻的应用程序 当我向API提供关键字作为参数时,我的页面是空白的,但如果我不提供任何关键字(即关键字的大小为0),我仍然可以获取最新的新闻。我做错了什么。下面提供了相应的代码 您可以参考此处的文档: Apiclient:Javascript 向my API提供关键字时接收空白页,javascript,json,api,rest,android-studio,Javascript,Json,Api,Rest,Android Studio,我正在开发一个使用新闻api检索新闻的应用程序 当我向API提供关键字作为参数时,我的页面是空白的,但如果我不提供任何关键字(即关键字的大小为0),我仍然可以获取最新的新闻。我做错了什么。下面提供了相应的代码 您可以参考此处的文档: Apiclient: package com.example.nvirone.API; import java.security.cert.CertificateException; import javax.net.ssl.HostnameVerifier;
package com.example.nvirone.API;
import java.security.cert.CertificateException;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class ApiClient {
public static final String BaseURL = "https://newsapi.org/v2/";
public static Retrofit retrofit ;
public static Retrofit getApiClient(){
if(retrofit==null){
retrofit = new Retrofit.Builder().baseUrl(BaseURL).client(getUnsafeOkHttpClient().build()).addConverterFactory(GsonConverterFactory.create()).build();
}
return retrofit;
}
public static OkHttpClient.Builder getUnsafeOkHttpClient(){
try {
// Create a trust manager that does not validate certificate chains
final TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
}
};
// Install the all-trusting trust manager
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
// Create an ssl socket factory with our all-trusting manager
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);
builder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
return builder;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
package com.example.nvirone;
import android.os.Bundle;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.nvirone.API.ApiClient;
import com.example.nvirone.API.ApiInterface;
import com.example.nvirone.Models.Article;
import com.example.nvirone.Models.News;
import java.util.ArrayList;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class Newspage extends AppCompatActivity {
public static final String API_KEY = "d8f92a1633724e958542f54458f9f23f";
private RecyclerView recyclerView;
private Adapter adapter;
private RecyclerView.LayoutManager layoutManager;
private List<Article> articles = new ArrayList<>();
private String TAG = Newspage.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_newspage);
recyclerView = findViewById(R.id.recyclerView);
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
adapter = new Adapter(articles, Newspage.this);
recyclerView.setAdapter(adapter);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setNestedScrollingEnabled(false);
LoadJson("");
}
public void LoadJson(final String keyword){
ApiInterface apiInterface = ApiClient.getApiClient().create(ApiInterface.class);
String country = Utils.getCountry();
String language = Utils.getLanguage();
Call<News> call;
if (keyword.length()>1){
call = apiInterface.getNewsSearch(keyword,language,"publishedAt",API_KEY);
}
else{
call = apiInterface.getNews(country, API_KEY);
}
call.enqueue(new Callback<News>() {
@Override
public void onResponse(Call<News> call, Response<News> response) {
List<Article> newArticles = response.body().getArticle();
if (response.isSuccessful() && newArticles!=null){
adapter.addArticles(newArticles);
}
}
@Override
public void onFailure(Call<News> call, Throwable t) {
Toast.makeText(Newspage.this,"NO result",Toast.LENGTH_LONG).show();
}
});
}
}
package com.example.nvirone.API;
import com.example.nvirone.Models.News;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;
public interface ApiInterface {
@GET("top-headlines")
Call<News> getNews(
@Query("country") String country,
@Query("apiKey") String apiKey
);
@GET("everything")
Call<News> getNewsSearch(
@Query("q") String Keyword,
@Query("language") String language,
@Query("SortBy") String sortBy,
@Query("apiKey") String apiKey
);
}
新闻页面:
package com.example.nvirone.API;
import java.security.cert.CertificateException;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class ApiClient {
public static final String BaseURL = "https://newsapi.org/v2/";
public static Retrofit retrofit ;
public static Retrofit getApiClient(){
if(retrofit==null){
retrofit = new Retrofit.Builder().baseUrl(BaseURL).client(getUnsafeOkHttpClient().build()).addConverterFactory(GsonConverterFactory.create()).build();
}
return retrofit;
}
public static OkHttpClient.Builder getUnsafeOkHttpClient(){
try {
// Create a trust manager that does not validate certificate chains
final TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
}
};
// Install the all-trusting trust manager
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
// Create an ssl socket factory with our all-trusting manager
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);
builder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
return builder;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
package com.example.nvirone;
import android.os.Bundle;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.nvirone.API.ApiClient;
import com.example.nvirone.API.ApiInterface;
import com.example.nvirone.Models.Article;
import com.example.nvirone.Models.News;
import java.util.ArrayList;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class Newspage extends AppCompatActivity {
public static final String API_KEY = "d8f92a1633724e958542f54458f9f23f";
private RecyclerView recyclerView;
private Adapter adapter;
private RecyclerView.LayoutManager layoutManager;
private List<Article> articles = new ArrayList<>();
private String TAG = Newspage.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_newspage);
recyclerView = findViewById(R.id.recyclerView);
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
adapter = new Adapter(articles, Newspage.this);
recyclerView.setAdapter(adapter);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setNestedScrollingEnabled(false);
LoadJson("");
}
public void LoadJson(final String keyword){
ApiInterface apiInterface = ApiClient.getApiClient().create(ApiInterface.class);
String country = Utils.getCountry();
String language = Utils.getLanguage();
Call<News> call;
if (keyword.length()>1){
call = apiInterface.getNewsSearch(keyword,language,"publishedAt",API_KEY);
}
else{
call = apiInterface.getNews(country, API_KEY);
}
call.enqueue(new Callback<News>() {
@Override
public void onResponse(Call<News> call, Response<News> response) {
List<Article> newArticles = response.body().getArticle();
if (response.isSuccessful() && newArticles!=null){
adapter.addArticles(newArticles);
}
}
@Override
public void onFailure(Call<News> call, Throwable t) {
Toast.makeText(Newspage.this,"NO result",Toast.LENGTH_LONG).show();
}
});
}
}
package com.example.nvirone.API;
import com.example.nvirone.Models.News;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;
public interface ApiInterface {
@GET("top-headlines")
Call<News> getNews(
@Query("country") String country,
@Query("apiKey") String apiKey
);
@GET("everything")
Call<News> getNewsSearch(
@Query("q") String Keyword,
@Query("language") String language,
@Query("SortBy") String sortBy,
@Query("apiKey") String apiKey
);
}
package com.example.nvirone;
导入android.os.Bundle;
导入android.widget.Toast;
导入androidx.appcompat.app.appcompat活动;
导入androidx.recyclerview.widget.DefaultItemAnimator;
导入androidx.recyclerview.widget.LinearLayoutManager;
导入androidx.recyclerview.widget.recyclerview;
导入com.example.nvirone.API.ApiClient;
导入com.example.nvirone.API.API接口;
导入com.example.nvirone.Models.Article;
导入com.example.nvirone.Models.News;
导入java.util.ArrayList;
导入java.util.List;
2.电话;;
2.回拨;
2.回应;;
公共类新闻页扩展了AppCompatActivity{
公共静态最终字符串API_KEY=“d8f92a1633724e958542f54458f9f23f”;
私人回收站;
专用适配器;
private RecyclerView.LayoutManager LayoutManager;
private List articles=new ArrayList();
私有字符串标记=Newspage.class.getSimpleName();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_新闻页面);
recyclerView=findViewById(R.id.recyclerView);
layoutManager=新的LinearLayoutManager(此);
recyclerView.setLayoutManager(layoutManager);
adapter=新适配器(文章、新闻页。此);
recyclerView.setAdapter(适配器);
setItemAnimator(新的DefaultItemAnimator());
recyclerView.setNestedScrollingEnabled(false);
LoadJson(“”);
}
public void LoadJson(最终字符串关键字){
ApiInterface ApiInterface=ApiClient.getApiClient().create(ApiInterface.class);
字符串country=Utils.getCountry();
String language=Utils.getLanguage();
呼叫呼叫;
if(关键字.length()>1){
call=apiInterface.getNewsSearch(关键字,语言,“publishedAt”,API_键);
}
否则{
call=apinterface.getNews(国家,API_键);
}
call.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
List newArticles=response.body().getArticle();
if(response.issusccessful()&&newArticles!=null){
adapter.addArticles(newArticles);
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
Toast.makeText(Newspage.this,“无结果”,Toast.LENGTH_LONG.show();
}
});
}
}
API接口:
package com.example.nvirone.API;
import java.security.cert.CertificateException;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class ApiClient {
public static final String BaseURL = "https://newsapi.org/v2/";
public static Retrofit retrofit ;
public static Retrofit getApiClient(){
if(retrofit==null){
retrofit = new Retrofit.Builder().baseUrl(BaseURL).client(getUnsafeOkHttpClient().build()).addConverterFactory(GsonConverterFactory.create()).build();
}
return retrofit;
}
public static OkHttpClient.Builder getUnsafeOkHttpClient(){
try {
// Create a trust manager that does not validate certificate chains
final TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
}
};
// Install the all-trusting trust manager
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
// Create an ssl socket factory with our all-trusting manager
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);
builder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
return builder;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
package com.example.nvirone;
import android.os.Bundle;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.nvirone.API.ApiClient;
import com.example.nvirone.API.ApiInterface;
import com.example.nvirone.Models.Article;
import com.example.nvirone.Models.News;
import java.util.ArrayList;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class Newspage extends AppCompatActivity {
public static final String API_KEY = "d8f92a1633724e958542f54458f9f23f";
private RecyclerView recyclerView;
private Adapter adapter;
private RecyclerView.LayoutManager layoutManager;
private List<Article> articles = new ArrayList<>();
private String TAG = Newspage.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_newspage);
recyclerView = findViewById(R.id.recyclerView);
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
adapter = new Adapter(articles, Newspage.this);
recyclerView.setAdapter(adapter);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setNestedScrollingEnabled(false);
LoadJson("");
}
public void LoadJson(final String keyword){
ApiInterface apiInterface = ApiClient.getApiClient().create(ApiInterface.class);
String country = Utils.getCountry();
String language = Utils.getLanguage();
Call<News> call;
if (keyword.length()>1){
call = apiInterface.getNewsSearch(keyword,language,"publishedAt",API_KEY);
}
else{
call = apiInterface.getNews(country, API_KEY);
}
call.enqueue(new Callback<News>() {
@Override
public void onResponse(Call<News> call, Response<News> response) {
List<Article> newArticles = response.body().getArticle();
if (response.isSuccessful() && newArticles!=null){
adapter.addArticles(newArticles);
}
}
@Override
public void onFailure(Call<News> call, Throwable t) {
Toast.makeText(Newspage.this,"NO result",Toast.LENGTH_LONG).show();
}
});
}
}
package com.example.nvirone.API;
import com.example.nvirone.Models.News;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;
public interface ApiInterface {
@GET("top-headlines")
Call<News> getNews(
@Query("country") String country,
@Query("apiKey") String apiKey
);
@GET("everything")
Call<News> getNewsSearch(
@Query("q") String Keyword,
@Query("language") String language,
@Query("SortBy") String sortBy,
@Query("apiKey") String apiKey
);
}
package com.example.nvirone.API;
导入com.example.nvirone.Models.News;
2.电话;;
导入文件2.http.GET;
导入2.http.Query;
公共接口{
@获取(“头条新闻”)
打电话给getNews(
@查询(“国家”)字符串国家,
@查询(“apiKey”)字符串apiKey
);
@获得(“一切”)
调用getNewsSearch(
@查询(“q”)字符串关键字,
@查询(“语言”)字符串语言,
@查询(“SortBy”)字符串SortBy,
@查询(“apiKey”)字符串apiKey
);
}
我认为问题出在新闻页面上,但不知道是什么