未从web服务器提取数据



我一直在尝试制作一个应用程序,从牛津词典应用程序中获取有关词源的数据。在尝试使用改装来获取数据时,总是调用onFailiure()。我将上传我的代码和正确的代码,但使用HttpsURLConnection作为参考的代码除外。

我认为app_key和app_id没有正确发送到服务器,所以我尝试用各种方式发送它们。添加@Headers标签的第一种方法

@Headers({"Accept: application/json","app_id: ********","app_key: ******************"})

我还尝试了一个拦截器来添加头。

@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request request = chain.request();
Request newRequest;
newRequest = request.newBuilder()
.addHeader(Accept,"application/json").addHeader(app_id,"*******").addHeader(app_key,"**********")
.build();
return chain.proceed(newRequest);
}

然后添加客户端进行改造。

但所有这些都返回了相同的错误。

这是我使用改装的代码。

主要活动.java

public class MainActivity extends AppCompatActivity {
GetDataInterface INTERFACE;
WordDetails wordclass;
TextView temp;
final String app_id = "*********";
final String app_key = "***************";
final String theword = "chaos";
final String word_id = theword.toLowerCase();
final String TheAdd = "https://od-api.oxforddictionaries.com:443/api/v2/entries/en-gb/";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
temp = (TextView)findViewById(R.id.temp);
wordclass = new WordDetails();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://od-api.oxforddictionaries.com:443/api/v2/entries/en-gb/")
.addConverterFactory(GsonConverterFactory.create())
.build();
INTERFACE = retrofit.create(GetDataInterface.class);
Call<WordDetails> call = INTERFACE.getData(word_id,"etymologies","false");
call.enqueue(new Callback<WordDetails>() {
@Override
public void onResponse(Call<WordDetails> call, Response<WordDetails> response) {
if(!response.isSuccessful())
{
System.out.println("Server Error.");
return;
}
wordclass = new WordDetails();
wordclass=response.body();
if(wordclass.getResults().getLexicalEntries().getEntries().getEtymologies()!=null)
{
temp.setText(wordclass.getResults().getLexicalEntries().getEntries().getEtymologies());
}
else
temp.setText("ERROR");
}
@Override
public void onFailure(Call<WordDetails> call, Throwable t) {
System.out.println("Failed to fetch.");
}
});
}

投掷

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 8 column 17 path $.results

GetDataInterface.java

public interface GetDataInterface {
final String app_id = "*********";
final String app_key = "************";
final String Accept = "application/json";
@Headers({"Accept: "+Accept,"app_id: "+app_id,"app_key: "+app_key})
@GET("{id}")
Call<WordDetails> getData(@Path("id") String Sambhar, @Query("fields") String Mirchi, @Query("strictMatch") String Trichy);
}

WordDetails.java

public class WordDetails {
Results results;
public Results getResults()
{
return results;
}
public WordDetails()
{
results = new Results();
}
class Results
{
Lexical lexicalEntries;
public Results()
{
lexicalEntries = new Lexical();
}
public Lexical getLexicalEntries() {
return lexicalEntries;
}
class Lexical
{
Entries entries;
public Lexical()
{
entries = new Entries();
}
public Entries getEntries() {
return entries;
}
class Entries
{
String etymologies;
public Entries()
{
etymologies="";
}
public String getEtymologies() {
return etymologies;
}
}
}
}
}

这是的Logcat

2019-07-04 16:45:25.872 22520-22616/? I/Adreno: Build Config                     : S L 6.0.7 AArch64
2019-07-04 16:45:25.879 22520-22616/? I/Adreno: PFP: 0x005ff112, ME: 0x005ff066
2019-07-04 16:45:25.884 22520-22616/? I/ConfigStore: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasWideColorDisplay retrieved: 0
2019-07-04 16:45:25.885 22520-22616/? I/ConfigStore: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasHDRDisplay retrieved: 0
2019-07-04 16:45:25.885 22520-22616/? I/OpenGLRenderer: Initialized EGL, version 1.4
2019-07-04 16:45:25.885 22520-22616/? D/OpenGLRenderer: Swap behavior 2
2019-07-04 16:45:26.955 22520-22614/com.example.spidertask3_v2 W/.spidertask3_v: Accessing hidden method Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setAlpnProtocols([B)V (light greylist, reflection)
2019-07-04 16:45:28.677 22520-22614/com.example.spidertask3_v2 W/.spidertask3_v: Accessing hidden method Lcom/android/org/conscrypt/OpenSSLSocketImpl;->getAlpnSelectedProtocol()[B (light greylist, reflection)
2019-07-04 16:45:29.121 22520-22520/com.example.spidertask3_v2 I/System.out: Failed to fetch. com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 8 column 17 path $.results

样本数据的形式如下

{
"metadata": {},
"results": [
{
"id": "string",
"language": "string",
"lexicalEntries": [
{
"derivativeOf": [
{
"domains": [
{
"id": "string",
"text": "string"
}
],
"id": "string",
"language": "string",
"regions": [
{
"id": "string",
"text": "string"
}
],
"registers": [
{
"id": "string",
"text": "string"
}
],
"text": "string"
}
],
"derivatives": [
{
"domains": [
{
"id": "string",
"text": "string"
}
],
"id": "string",
"language": "string",
"regions": [
{
"id": "string",
"text": "string"
}
],
"registers": [
{
"id": "string",
"text": "string"
}
],
"text": "string"
}
],
"entries": [
{
"etymologies": [
"string"
],
"grammaticalFeatures": [
{
"id": "string",
"text": "string",
"type": "string"
}
],
"homographNumber": "string",
"notes": [
{
"id": "string",
"text": "string",
"type": "string"
}
],
"pronunciations": [
{
"audioFile": "string",
"dialects": [
"string"
],
"phoneticNotation": "string",
"phoneticSpelling": "string",
"regions": [
{
"id": "string",
"text": "string"
}
]
}
],
"senses": [
{
"crossReferenceMarkers": [
"string"
],
"crossReferences": [
{
"id": "string",
"text": "string",
"type": "string"
}
],
"definitions": [
"string"
],
"domains": [
{
"id": "string",
"text": "string"
}
],
"examples": [
{
"definitions": [
"string"
],
"domains": [
{
"id": "string",
"text": "string"
}
],
"notes": [
{
"id": "string",
"text": "string",
"type": "string"
}
],
"regions": [
{
"id": "string",
"text": "string"
}
],
"registers": [
{
"id": "string",
"text": "string"
}
],
"senseIds": [
"string"
],
"text": "string"
}
],
"id": "string",
"notes": [
{
"id": "string",
"text": "string",
"type": "string"
}
],
"pronunciations": [
{
"audioFile": "string",
"dialects": [
"string"
],
"phoneticNotation": "string",
"phoneticSpelling": "string",
"regions": [
{
"id": "string",
"text": "string"
}
]
}
],
"regions": [
{
"id": "string",
"text": "string"
}
],
"registers": [
{
"id": "string",
"text": "string"
}
],
"shortDefinitions": [
"string"
],
"subsenses": [
{}
],
"thesaurusLinks": [
{
"entry_id": "string",
"sense_id": "string"
}
],
"variantForms": [
{
"domains": [
{
"id": "string",
"text": "string"
}
],
"notes": [
{
"id": "string",
"text": "string",
"type": "string"
}
],
"pronunciations": [
{
"audioFile": "string",
"dialects": [
"string"
],
"phoneticNotation": "string",
"phoneticSpelling": "string",
"regions": [
{
"id": "string",
"text": "string"
}
]
}
],
"regions": [
{
"id": "string",
"text": "string"
}
],
"registers": [
{
"id": "string",
"text": "string"
}
],
"text": "string"
}
]
}
],
"variantForms": [
{
"domains": [
{
"id": "string",
"text": "string"
}
],
"notes": [
{
"id": "string",
"text": "string",
"type": "string"
}
],
"pronunciations": [
{
"audioFile": "string",
"dialects": [
"string"
],
"phoneticNotation": "string",
"phoneticSpelling": "string",
"regions": [
{
"id": "string",
"text": "string"
}
]
}
],
"regions": [
{
"id": "string",
"text": "string"
}
],
"registers": [
{
"id": "string",
"text": "string"
}
],
"text": "string"
}
]
}
],
"grammaticalFeatures": [
{
"id": "string",
"text": "string",
"type": "string"
}
],
"language": "string",
"lexicalCategory": {
"id": "string",
"text": "string"
},
"notes": [
{
"id": "string",
"text": "string",
"type": "string"
}
],
"pronunciations": [
{
"audioFile": "string",
"dialects": [
"string"
],
"phoneticNotation": "string",
"phoneticSpelling": "string",
"regions": [
{
"id": "string",
"text": "string"
}
]
}
],
"text": "string",
"variantForms": [
{
"domains": [
{
"id": "string",
"text": "string"
}
],
"notes": [
{
"id": "string",
"text": "string",
"type": "string"
}
],
"pronunciations": [
{
"audioFile": "string",
"dialects": [
"string"
],
"phoneticNotation": "string",
"phoneticSpelling": "string",
"regions": [
{
"id": "string",
"text": "string"
}
]
}
],
"regions": [
{
"id": "string",
"text": "string"
}
],
"registers": [
{
"id": "string",
"text": "string"
}
],
"text": "string"
}
]
}
],
"pronunciations": [
{
"audioFile": "string",
"dialects": [
"string"
],
"phoneticNotation": "string",
"phoneticSpelling": "string",
"regions": [
{
"id": "string",
"text": "string"
}
]
}
],
"type": "string",
"word": "string"
}
]
}

现在是一个使用HttpsURLConnection并且运行良好的。(供参考以帮助我修改代码)

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TEMP = (TextView) findViewById(R.id.TEMP);
new CallbackTask().execute(dictionaryEntries());
}
private String dictionaryEntries() {
final String language = "en-gb";
final String word = "chaos";
final String fields = "etymologies";
final String strictMatch = "false";
final String word_id = word.toLowerCase();
return "https://od-api.oxforddictionaries.com:443/api/v2/entries/" + language + "/" + word_id + "?" + "fields=" + fields + "&strictMatch=" + strictMatch;
}

private class CallbackTask extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... params) {
final String app_id = "********";
final String app_key = "******************";
try {
URL url = new URL(params[0]);
HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
urlConnection.setRequestProperty("Accept","application/json");
urlConnection.setRequestProperty("app_id",app_id);
urlConnection.setRequestProperty("app_key",app_key);
// read the output from the server
BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
StringBuilder stringBuilder = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line + "n");
}
return stringBuilder.toString();
}
catch (Exception e) {
e.printStackTrace();
return e.toString();
}
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
TEMP.setText(result);
}
}

作为应用程序的输出类似于https://ibb.co/0FCtG21

我希望使用改装将数据(混乱的词源)显示在文本视图中。HttpsURLConnection可供参考,以显示oxford api的性质。

事实证明,我的WordDetails.class是错误的。所有的变量都必须是列表形式。

public class WordDetails {
List<Results> results;
public List<Results> getResults()
{
return results;
}
class Results
{
List<Lexical> lexicalEntries;
public List<Lexical> getLexicalEntries() {
return lexicalEntries;
}
class Lexical
{
List<Entries> entries;
public List<Entries> getEntries() {
return entries;
}
class Entries
{
List<String> etymologies;
public List<String> getEtymologies() {
return etymologies;
}
}
}
}
}