gpt4 book ai didi

java - 收到 GAE 响应时如何处理 JsonSyntaxException

转载 作者:太空宇宙 更新时间:2023-11-04 12:59:11 24 4
gpt4 key购买 nike

我正在尝试复制 Google App Engine Servlet 模块 here使用 Retrofit 而不是 AsyncTask。

我觉得很奇怪,但显然 Retrofit 2.0 不支持连接到 Google App Engine,如所述 here在 GitHub 存储库的问题中。

因此,我使用的是 Retrofit 1.9 和 OkHttp 2.3 依赖项。

我在 Google 开发者控制台中创建了一个名为“Retrofit Test”的项目,Google 为我提供了该项目的 URL:“http://retrofit-test-1203.appspot.com ”,子域为“http://retrofit-test-1203.appspot.com/hello 。这些将是我各自的 Retrofit URL。以下是我的代码:

Gradle :

apply plugin: 'com.android.application'

android {
compileSdkVersion 23
buildToolsVersion "23.0.1"

defaultConfig {
applicationId "com.troychuinard.retrofittest"
minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
compile 'com.squareup.retrofit:retrofit:1.9.0'
compile 'com.squareup.okhttp:okhttp:2.3.0'


}

主要 Activity :

public class MainActivity extends AppCompatActivity {

//set the URL of the server, as defined in the Google Servlets Module Documentation
private static String PROJECT_URL = "http://retrofit-test-1203.appspot.com";
private Button mTestButton;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mTestButton = (Button) findViewById(R.id.test_button);



//Instantiate a new UserService object, and call the "testRequst" method, created in the interface
//to interact with the server
mTestButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Instantiate a new RestAdapter Object, setting the endpoint as the URL of the server
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(PROJECT_URL)
.setClient(new OkClient(new OkHttpClient()))
.build();

UserService userService = restAdapter.create(UserService.class);
userService.testRequest("Test_Name", new Callback<String>() {
@Override
public void success(String s, Response response) {
Toast.makeText(getApplicationContext(), s, Toast.LENGTH_LONG).show();

}

@Override
public void failure(RetrofitError error) {
Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show();
}
});
}
});


}
}

用户服务(改造)

public interface UserService {

@POST("/hello")
void testRequest(@Query("name") String name, Callback<String> cb);

}

我的Servlet:

public class MyServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/plain");
resp.getWriter().println("Please use the form to POST to this url");
}

@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
String name = req.getParameter("name");
resp.setContentType("text/plain");
if(name == null) {
resp.getWriter().println("Please enter a name");
}
resp.getWriter().println("Hello " + name);
}
}

如您所见,我已经设置了该项目,以便通过单击按钮发出服务器请求。与 Google App Engine Servlet 模块类似,我期望收到来自服务器的响应,然后将其显示为 Toast,其中显示“Hello +(在 .testRequest() 方法中输入的任何参数,在本例中为“Test_Name”)。我收到以下错误,欢迎对我的方法提供任何帮助/建议:

enter image description here

最佳答案

这里的问题是,当您应该作为 @Field 发送时,您正尝试以 @Query 的形式发送带有“name”参数的 POST。

尝试这样的方法:

@FormUrlEncoded
@POST("/hello")
void testRequest(@Field("name") String name, Callback<String> cb);

关于java - 收到 GAE 响应时如何处理 JsonSyntaxException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35068601/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com