我正在创建一个Android应用程序,该应用程序使用其REST API从WordPress站点获取数据。但到目前为止,由于缺乏资源,我无法解决这个问题。
所以现在我只想下载 JSON 格式的 WordPress 数据,将其保存在本地,然后使用它来解析和填充我的应用程序中的内容。是否有一个流程或插件可以帮助我下载 JSON 格式的 WordPress 文章?
您可以下载CSV格式的文章并将其转换为JSON,有在线工具可以做到这一点。或者您可以使用插件将其下载为JSON格式:https://wordpress.org/plugins/hiweb-export-posts/
我认为在JSON中检索Wordpress数据的一个很好的解决方案是使用REST API。使用 API,您将能够检索帖子、类别、标签、评论等。全部采用 JSON 格式,您可以在其中解析它。
您可以在 REST API手册中查看 REST API 参考
Wordpress REST API默认输出JSON,所以你不需要任何插件。
你没有说你是否在你的应用程序中使用 Java 或 Kotlin,所以我在 Java 中创建了一个工作示例,只是为了让更多的用户可以使用它。我试图使代码尽可能简单,而无需使用任何第三方库进行网络和 JSON 解析。
具有权限的清单文件。网络所需的互联网:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.wordpressfetchdata">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="GoogleAppIndexingWarning">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
主要活动:
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private static final String WORDPRESS_SITE_URL = "http://10.0.2.2/wordpress"; //Use http://10.0.2.2 to access Wordpress running on localhost from emulator on same PC
private static final String WORDPRESS_REST_API_URL = WORDPRESS_SITE_URL + "/wp-json/wp/v2";
private static final String WORDPRESS_REST_API_POSTS_URL = WORDPRESS_REST_API_URL + "/posts";
private static final String NEW_LINE = "n";
private TextView contentView;
private LoadWordpressPostsTask loadWordpressPostsTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contentView = findViewById(R.id.content);
loadPostsFromWordpress();
}
private void loadPostsFromWordpress() {
//Create a AsyncTask which will load data on a background thread
loadWordpressPostsTask = new LoadWordpressPostsTask();
loadWordpressPostsTask.setListener(new LoadWordpressPostsTask.LoadListener() {
@Override
public void onLoadSuccess(List<WordpressPost> data) {
showPosts(data);
}
@Override
public void onLoadFailure(String errorMessage) {
showLoadError(errorMessage);
}
});
loadWordpressPostsTask.execute(WORDPRESS_REST_API_POSTS_URL);
}
private void showLoadError(String errorMessage) {
if (contentView != null) {
contentView.setText(errorMessage);
}
}
private void showPosts(List<WordpressPost> posts) {
if (contentView != null) {
int numPosts = posts.size();
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(String.format(Locale.getDefault(), "Loaded %d posts from Wordpress", numPosts));
stringBuilder.append(NEW_LINE);
for (WordpressPost post : posts) {
stringBuilder.append(NEW_LINE);
stringBuilder.append("Title: ");
stringBuilder.append(post.getTitle());
stringBuilder.append(NEW_LINE);
stringBuilder.append("Content: ");
stringBuilder.append(post.getContent());
}
contentView.setText(stringBuilder.toString());
}
}
@Override
protected void onDestroy() {
//Remove listener and AsyncTask to avoid memory leak
if (loadWordpressPostsTask != null) {
loadWordpressPostsTask.setListener(null);
loadWordpressPostsTask = null;
}
super.onDestroy();
}
private static class LoadWordpressPostsTask extends AsyncTask<String, Void, LoadWordpressPostsTask.LoadResult> {
private LoadListener listener;
interface LoadListener {
void onLoadSuccess(List<WordpressPost> result);
void onLoadFailure(String errorMessage);
}
void setListener(LoadListener listener) {
this.listener = listener;
}
class LoadResult {
private List<WordpressPost> posts;
private String errorMessage;
LoadResult(List<WordpressPost> posts) {
this.posts = posts;
}
LoadResult(String errorMessage) {
this.errorMessage = errorMessage;
}
boolean hasError() {
return errorMessage != null;
}
}
@Override
protected LoadResult doInBackground(String... urls) {
LoadResult result = null;
if (!isCancelled() && urls != null && urls.length > 0) {
String urlString = urls[0];
try {
String jsonData = loadJsonDataFromWordpress(urlString);
Log.d(TAG, String.format(Locale.getDefault(), "Got data from %s : %s", urlString, jsonData));
if (!isCancelled()) {
List<WordpressPost> posts = parseJsonData(jsonData);
result = new LoadResult(posts);
}
} catch (IOException | JSONException e) {
result = new LoadResult(e.getMessage());
}
}
return result;
}
private List<WordpressPost> parseJsonData(String jsonData) throws JSONException {
List<WordpressPost> wordpressPosts = new ArrayList<>();
JSONArray posts = new JSONArray(jsonData);
for (int i = 0; i < posts.length(); i++) {
//For response properties see: https://developer.wordpress.org/rest-api/reference/posts/#schema
JSONObject postObject = posts.getJSONObject(i);
JSONObject titleObject = postObject.getJSONObject("title");
String title = titleObject.getString("rendered");
JSONObject contentObject = postObject.getJSONObject("content");
String content = contentObject.getString("rendered");
WordpressPost wordpressPost = new WordpressPost(title, content);
wordpressPosts.add(wordpressPost);
}
return wordpressPosts;
}
@Override
protected void onPostExecute(LoadResult result) {
if (!isCancelled() && listener != null) {
if (result != null) {
if (result.hasError()) {
listener.onLoadFailure(result.errorMessage);
} else {
List<WordpressPost> posts = result.posts;
listener.onLoadSuccess(posts);
}
} else {
listener.onLoadFailure("No result!");
}
}
}
private String loadJsonDataFromWordpress(String urlString) throws IOException {
String jsonData = null;
HttpURLConnection connection = null; //Change this to HttpsURLConnection when using HTTPS, which you should be using!
try {
URL url = new URL(urlString);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.connect();
int responseCode = connection.getResponseCode();
if (responseCode != HttpURLConnection.HTTP_OK) {
throw new IOException("HTTP error code: " + responseCode);
}
try (InputStream stream = connection.getInputStream()) {
if (stream != null) {
Reader inputStreamReader = new InputStreamReader(stream, StandardCharsets.UTF_8);
try (BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) {
StringBuilder buffer = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
buffer.append(line);
}
jsonData = buffer.toString();
}
}
}
} finally {
if (connection != null) {
connection.disconnect();
}
}
return jsonData;
}
}
}
将WORDPRESS_SITE_URL替换为您的 Wordpress 网站的 URL。
一个保存Wordpress帖子数据的POJO类:
public class WordpressPost {
private final String title;
private final String content;
WordpressPost(String title, String content) {
this.title = title;
this.content = content;
}
public String getTitle() {
return title;
}
public String getContent() {
return content;
}
}
主活动布局文件:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"/>
</android.support.constraint.ConstraintLayout>